連想配列要素の間接割り当て

連想配列要素の間接割り当て

次のような状況にあるとき:

a=foo
b=baz

私は利用できる

typeset "$a=$b"

しかし、aが配列要素を参照すると失敗します。

$ a=foo[bar]
$ b=baz
$ typeset "$a=$b"
$ declare -p foo
declare -a foo=([0]="baz")

つまり、barは何らかの理由で変数名として扱われます。declare -A foo=([bar]="baz")可能であれば、解析なしで結果を得るためにこれを変更する方法についてのアイデアはありますか$a

ベストアンサー1

foo連想配列を宣言したことがありません。配列と「スカラー」(一般変数を記述するのに良い言葉が必要です)は宣言する必要はありませんが、連想配列は宣言します。

foo連想配列として宣言していないため、コードはこれfoo[0]をに設定しますbaz。これは、算術コンテキストで使用されるため、インデックス0を設定しますbar(通常の配列割り当てであるため).変数はbar通常の配列のインデックスとして使用され、その値は0または設定されていません(存在しません)。

つまり、宣言の内容は連想配列であることをfoo[bar]=baz示していません。fooデフォルトではこれは通常の配列であり、bar算術コンテキストではいくつかの整数インデックスとして解釈されます(変数が存在しない場合、その値はゼロと評価されます)。

必要なものを得るには、それをfoo連想配列として宣言する必要があります。

a=foo[bar]
b=baz

declare -A foo

typeset "$a=$b"
declare -p foo

これは出力されます

declare -A foo=([bar]="baz" )

おすすめ記事