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
сумісності. (Я не знаю, чому Баш не просто так зателефонував typeset
). Там ще третій синонім local
. Є також export
те ж саме declare -x
, що і для сумісності (з кожною оболонкою в стилі Борна).
declare
робить NAMEs локальними, як і вlocal
команді. Цей-g
варіант пригнічує таку поведінку. Дивhelp declare
.