В чем разница между объявить и набирать

22

Может ли кто-нибудь объяснить разницу между объявлениями и наборами на реальных примерах.

Рахул Патил
источник

Ответы:

27

В bash, typesetи declareточно так же. Разница лишь в том, что typesetсчитается устаревшим.

typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...
    Set variable values and attributes.

    Obsolete.  See `help declare'.

Страница man даже перечисляет их на одном дыхании:

declare [-aAfFgilrtux] [-p] [name[=value] ...]
typeset [-aAfFgilrtux] [-p] [name[=value] ...]
    Declare variables and/or give them attributes.

typesetпереносим на некоторые другие оболочки, например ksh93. Если вы стремитесь к переносимости между оболочками, используйте typeset(и убедитесь, что способ, которым вы звоните, является переносимым). Если вас не волнует такая мобильность, используйте declare.

Крис Даун
источник
Можете ли вы привести пример того, где и почему это используется в скрипте bash
Rahul Patil
1
... как я уже сказал, они точно такие же. Я не понимаю, как я могу их дифференцировать, если они таковы.
Крис Даун
2
Хороший. Обратите внимание, что устаревшее просто появляется в help typeset, а не в man typeset.
Федорки
2
@ChrisDown, вы случайно не знаете, почему именно typesetсчитается устаревшим?
Алексей Магура
3

Я знаю случай, когда declareполезно избежать зла eval: переменная косвенность :

$ var=foo
$ x=var
$ declare "$x=another_value"
$ echo $var
another_value
Жиль Квено
источник
Это хороший комментарий, но как он отвечает на вопрос, который о typesetи declare?
jw013
На это уже хорошо ответил Крис Даун, мой ответ - всего лишь случай, когда он
полезен
Возможно, я не был ясен. Комментарии должны быть комментариями, а ответы должны быть ответами. Это комментарий, а не ответ.
jw013
3
Мой фрагмент не будет понятен в комментарии
Жиль Квено
но вы все еще можете назначать переменные с помощью typeset ... просто замените объявить на typeset, и вы все равно получите тот же результат.
pcarvalho