Наиболее важной целью использования declare
является управление областью действия или использование типов массивов, которые иначе недоступны.
Использование функционально-локальных переменных
Чтобы дать вам пример:
print_dashes() { for (( i=0; i<10; i++; do printf '-'; done; echo; }
while read -p "Enter a number: " i; do
print_dashes
echo "You entered: $i"
done
Вы ожидаете, что это напечатает номер, введенный пользователем, верно? Но вместо этого он всегда будет печатать значение i
, которое print_dashes
оставляет после завершения.
Рассмотрим вместо этого:
print_dashes() {
declare i # ''local i'' would also have the desired effect
for (( i=0; i<10; i++; do printf '-'; done; echo;
}
... сейчас i
является локальным , поэтому вновь назначенное значение не сохраняется после его вызова.
Объявление явно глобальных переменных
Наоборот, иногда вы хотите объявить глобальную переменную и дать понять читателям вашего кода, что вы делаете это с помощью намерения , или сделать это при объявлении чего-либо как массива (или в противном случае declare
в противном случае неявно указывает глобальное состояние). Вы можете сделать это тоже:
myfunc() {
declare arg # make arg local
declare -g -A myfunc_args_seen # make myfunc_args_seen a global associative array
for arg; do
myfunc_args_seen["$arg"]=1
done
echo "Across all invocations of myfunc, we have seen the following arguments:"
printf ' - %q\n' "${!myfunc_args_seen[@]}"
}
Объявление ассоциативных массивов
Обычный Массивы оболочки можно просто назначить: my_arr=( one two three )
Однако это не относится к ассоциативным массивам, которые обозначаются как строки. Для них вам нужно объявить их:
declare -A my_arr=( ["one"]=1 ["two"]=2 ["three"]=3 )