间接分配给关联数组元素

间接分配给关联数组元素

当我有以下情况时:

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" )

相关内容