如何使用交替键和值的序列来定义Bash5.1关联数组?
我在Bash 5.1的发行说明中读到:
GG。可以使用复合分配中的键值对列表来分配关联数组。单词不是 [key]=value 形式的复合赋值被假定为键值赋值。缺少或为空的键是错误;缺失值被视为 NULL。作业不得混合两种形式。
检查Bash 5.1 参考手册?数组部分我看到了这个新块(与Bash 4.4 参考手册相比):
赋值给关联数组时,复合赋值中的单词可以是赋值语句(需要下标),也可以是解释为交替键和值序列的单词列表:
name=(key1 value1 key2 value2 … )。它们的处理方式与 相同name=( [key1]=value1 [key2]=value2 … )。列表中的第一个单词决定了其余单词的解释方式;列表中的所有分配都必须是同一类型。使用键/值对时,键不能丢失或为空;最终缺失值被视为空字符串。这个语法也被 declare 内置函数接受。可以使用
name[subscript]=value上面介绍的语法分配单个数组元素。
于是我做了一个测试:
$ bash --version
GNU bash, version 5.1.0(1)-release (x86_64-apple-darwin18.5.0)
$ declare -a bla
$ bla=( [name]=me )
$ echo "${bla[name]}"
me # it works well
但是,如果我使用新语法,它对我不起作用,它会返回键而不是值:
$ declare -a bla
$ ble=( name me )
$ echo "${ble[name]}"
name # should be "me"
如何正确使用复合赋值作为交替键和值的序列?
回答
这是定义关联数组的问题declare -A(注意“A”的大写字母):
declare -A bla
$ bla=(k1 v1 k2 v2)
$ echo "${bla[k1]}"
v1
如果您尝试混合分配,则会失败,如下所示:
$ bla=([k1]=v1 k2 v2)
bash: bla: k2: must use subscript when assigning associative array
bash: bla: v2: must use subscript when assigning associative array
$ bla=([k1]=v1 [k2]=v2)
$ echo "${bla[k2]}"
v2