当我有以下情况时:
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
.它设置索引零,因为bar
正在算术上下文中使用(因为它是普通的数组赋值)。您的bar
变量用作普通数组中的索引,其值要么为零,要么未设置(不存在)。
简而言之,声明中没有任何内容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" )