abc=ok
присваивает значение переменной abc
. declare abc
объявляет переменную с именем abc
. Два могут быть объединены как declare abc=ok
.
В bash, как и в других оболочках, переменные строк и массивов не нужно объявлять, поэтому declare
нет необходимости, если вы не хотите передавать параметры, например, declare -A abc
чтобы создать abc
ассоциативный массив или declare -r
сделать переменную доступной только для чтения. Тем не менее, внутри функции declare
имеет значение: она вызывает переменную, чтобы быть локальной для функции, то есть значение переменной за пределами функции (если таковые имеются) сохраняется. (Если только вы не используете declare -g
, что делает переменную не локальной, это полезно в сочетании с другими параметрами, например, declare -gA
для создания глобального ассоциативного массива в функции.) Пример:
f () {
declare a
a='a in f'
b='b in f'
echo "From f: a is $a"
echo "From f: b is $b"
}
a='Initial a'
b='Initial b'
f
echo "After f: a is $a"
echo "After f: b is $b"
Выход:
From f: a is a in f
From f: b is b in f
After f: a is Initial a
After f: b is b in f
Еще одна вещь, которую вы можете сделать с помощью declare
встроенного
declare
Встроенный является уникальной для Баша. Он сильно вдохновлен и очень близок к typeset
встроенному в ksh , а bash typeset
является синонимом declare
совместимости. (Я не знаю, почему Bash не просто назвал это typeset
). Есть третий синоним local
. Кроме того export
, есть то же самое, что declare -x
и для совместимости (с каждой оболочкой в стиле Борна).
declare
делает имена локальными, как сlocal
командой.-g
Опция подавляет такое поведение. Смhelp declare
.