zsh shell 中的错误替换错误

Mun*_*sin 5 zsh array

嗨,在我之前的问题中,我清楚地了解了如何在 zsh shell 中使用关联数组。

但是每当我在脚本中触发以下命令时

for KEY in ${!array[@]} 在我的数组中的键之间迭代

我得到一个bad substitution错误。

甚至echo ${!array[@]}给出相同的。

注意:array是我的关联数组的名称

Mic*_*mer 8

zsh与 Bash 具有不同的参数替换,这在man zshexpn. 它支持扩展行为的各种修饰符,这些修饰符放在变量名之前的括号中:${(X)name}。包含数组键(包括关联数组)的修饰符是k:${(k)array}扩展到数组中的键列表,除非键是空字符串,否则将被省略。使用双引号和@修饰符保留空键。

for x in "${(@k)array}" ; ...
Run Code Online (Sandbox Code Playgroud)

将遍历数组的键array


cuo*_*glm 6

您必须使用"${(@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
Run Code Online (Sandbox Code Playgroud)

然后:

$ zsh test.zsh 
k1 -> v1
k2 -> v2
k3 -> v3
Run Code Online (Sandbox Code Playgroud)

您还可以for用键、值扩展替换循环:

printf '%s -> %s\n' "${(@kv)array}"
Run Code Online (Sandbox Code Playgroud)