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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.