2012-04-21 15 views
1

bashのバッシュ連想配列エラー

foo=foo 
my_array[$foo]=bar 

で次のコマンドを実行しようとすると、私はエラー「bashのを:FOO:超過表現の再帰レベル(エラー・トークンは 『foo』というある」)を得ます。しかしこれは正常に動作します:

foo=hello 
my_array[$foo]=bar 

どうしてですか?

答えて

3

問題は、配列が連想型であると宣言していないため、数値配列と見なされることです。 bashが

my_array[$foo]=bar 

を評価しようとするとどのような彼はに入ってくることは

my_array[foo]=bar 

ですが、配列のインデックスは、まだ数値ではないので、彼は再びそれを評価しようとすると、

my_array[foo]=bar 
へ続きます

のように、角カッコの間に$を使用する必要はありません。再帰レベルを超えて例外がスローされるまで、これは繰り返し実行されることがわかります。ただ連想として配列を宣言し、それを解決するために

declare -A my_array 
+0

おかげで、この問題を解決しました。しかし、なぜ私の質問の2番目の例はそれで動作しますか? –

+0

私の推測では、bashが 'my_array [$ foo] = bar'を評価して' my_array [hello] = bar'に展開すると、それを再び評価しようとしますが、$ helloには一致しません。リテラルな文字列であるため、配列を結合的なものと見なして評価を停止します。 – Win32

+0

@ Win32:$ {my_array [0]}に 'bar'を付けると、配列を連想型に変換しません。 – choroba