Bashバージョン「GNU bash、バージョン4.1.10(4)-release(i686-pc-cygwin)」で次のコードを実行すると、次の結果が表示されます。
declare a
declare -p a
# Output: -bash: declare: a: not found
declare -i b
declare -p b
# Output: -bash: declare: b: not found
declare -a c
declare -p c
# Output: declare -a c='()'
declare -A d
declare -p d
# Output: declare -A d='()'
言い換えれば、上記の変数はすべての場合に初期化されなければならないか、どんな場合でも初期化されてはならないと思います。これは、宣言時に配列を初期化するよりも一貫性があるようです。
答え1
私は次のように変数を常に安全で均一に宣言して初期化できると思います。
declare a=""
declare -p a
# Output: declare -- a=""
declare -i b=0
declare -p b
# Output: declare -i b="0"
declare -a c=()
declare -p c
# Output: declare -a c='()'
declare -A d=()
declare -p d
# Output: declare -A d='()'
Bashシェルの異なるバージョン間には異なる動作があるようです。
変数を宣言するときに明示的な初期化値を指定しないと、ローカル変数を使用する次の例のように結果が予想されない可能性があります。
function foobar {
declare a
declare -i b
declare -a c
declare -A d
declare -p a b c d
a=a
b=42
c+=(c)
d+=([d]=42)
declare -p a b c d
}
foobar
# Output:
# declare -- a=""
# declare -i b=""
# declare -a c='()'
# declare -A d='()'
# Output:
# declare -- a="a"
# declare -i b="42"
# declare -a c='([0]="c")'
# declare -A d='([d]="42" )'
declare -p a b c d
# Output:
# bash: declare: a: not found
# bash: declare: b: not found
# bash: declare: c: not found
# bash: declare: d: not found
ローカル変数と遅い初期化の場合、すべてが期待どおりに機能します。特に、関数declare -p a b c d
内の最初の項目は、foobar
すべての変数がデータ型固有のデフォルト値に初期化されたことを報告します。これをグローバル変数の場合と比較してみてください。ここで、および変数a
はそれぞれおよびb
として報告されます。-bash: declare: a: not found
-bash: declare: b: not found