你好,在我的上一个问题我清楚地了解了如何在 zsh shell 中使用关联数组。
但是每当我在脚本中触发以下命令时
for KEY in ${!array[@]}
在我的数组中的键之间进行迭代
我收到一个bad substitution
错误。
甚至echo ${!array[@]}
给出相同的。
注意:array
是我的关联数组的名称
答案1
zsh
与 Bash 有不同的参数替换,记录在man zshexpn
。它支持多种扩展行为的修饰符,放在变量名之前的括号中:${(X)name}
。包含数组键(包括关联数组)的修饰符是k
:${(k)array}
扩展到数组中的键列表,但如果键是空字符串,则将其省略。使用双引号和@
修饰符保留空键。
for x in "${(@k)array}" ; ...
将循环遍历数组的键array
。
答案2
您必须使用"${(@k)array}"
,"${(k)array}"
仅扩展到非空键:
typeset -A array
array=(k1 v1 k2 v2 k3 v3)
for k in "${(@k)array}"; do
printf "%s -> %s\n" "$k" "$array[$k]"
done
然后:
$ zsh test.zsh
k1 -> v1
k2 -> v2
k3 -> v3
您还可以for
用键、值扩展替换循环:
printf '%s -> %s\n' "${(@kv)array}"
答案3
据我所知,${!...}
不存在。我想你想要:${(k)array[@]}
,或者简单地${(k)array}
。有关更多信息,请参阅zshexpn(1)
手册页,其中对于扩展标志说k
:“如果名称引用关联数组,则替换键(元素名称)而不是元素的值。”