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.