`declare -a A`はBashで空の配列 `A`を生成しますか?

`declare -a A`はBashで空の配列 `A`を生成しますか?

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 adeclare -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できます。exportreadonly

$ sh -uc 'unset -v var; readonly var; : "$var"'
sh: 1: var: parameter not set

変数はunset設定されず宣言されません。では、外部スコープから変数を復元できますbashmkshyash

モックに加えて、変数の使用が宣言され、zsh変数が設定されていないか設定されているが、他の型(スカラー、配列、または関連配列)に属している場合はnullに設定されます。shtypeset

おすすめ記事