zsh shell 中的错误替换错误

zsh shell 中的错误替换错误

你好,在我的上一个问题我清楚地了解了如何在 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:“如果名称引用关联数组,则替换键(元素名称)而不是元素的值。”

相关内容