次のような状況にあるとき:
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" )