
bashでdeclare -a A
空の配列を作成しますか、それとも後で割り当てるA
場合に備えてプロパティを設定しますか?A
次のコードを検討してください。
set -u
declare -a A
echo ${#A[*]}
echo ${A[*]}
A=()
echo ${#A[*]}
echo ${A[*]}
A=(1 2)
echo ${#A[*]}
echo ${A[*]}
予想される出力は何ですか?
Bash 4.3.48(1)bash: A: unbound variable
以降の要素数を問い合わせるとdeclare
。すべての要素にアクセスすると、このエラーが発生します。 Bashの将来のバージョンでは、これを異なる方法で処理することがわかります。私はまだそれが本当declare
かどうか知りたいです。定義変数(空)。
答え1
これは、変数が現在のスコープ(グローバルまたは現在の関数とも呼ばれる最上位レベル)で宣言されているかどうかによって異なります。
現在の範囲で宣言されていない場合(最上位範囲では、変数発表する(環境から取得して割り当て)次に宣言し(関数の範囲で関数にローカルにする)、型を割り当てますが初期化しないでください。空のリストにも初期化しないでください(表示されていないdeclare -p a
)declare -a a
としてdeclare -a a=()
宣言および/または割り当てるのと同じですa=()
。
現在のスコープですでに宣言されている場合(例:グローバルスコープの環境からスカラー変数にインポートされたため)declare -a a
。変化配列に変換します。
以前にスカラーだった場合は([0]=value-of-the-variable)
配列になります。すでに配列の場合は変更されていません。連想配列の場合、cannot convert associative to indexed array
エラーで失敗します。
これはdeclare a
配列やハッシュをスカラーに変換しないことに注意してください。bash
とにかく、ハッシュ/配列をスカラーに変換する方法はありません。強制スカラーを使用できますdeclare +aA a
(変数が以前に現在の範囲のハッシュ/配列であった場合は、エラーで失敗します)。
あなたの場合、変数は現在の範囲で宣言されていない可能性があるため、最終的に宣言されますが、割り当てられません。これはset -u
。
2つの違い発表するそして分散/置く変数の状態は限定されませんbash
。 POSIXでは、変数を作成するか、未割り当てのままにすることもsh
できます。export
readonly
$ sh -uc 'unset -v var; readonly var; : "$var"'
sh: 1: var: parameter not set
変数はunset
設定されず宣言されません。では、外部スコープから変数を復元できますbash
。mksh
yash
モックに加えて、変数の使用が宣言され、zsh
変数が設定されていないか設定されているが、他の型(スカラー、配列、または関連配列)に属している場合はnullに設定されます。sh
typeset