zsh:zparseopts 未按预期运行

zsh: zparseopts not behaving as expected

看来我一定是用错了 zparseopts,因为我没有得到这个简单示例脚本的预期输出。

zparseopts 似乎错误地假设 -h--help 有一个参数,即使它们是在没有 :.

的情况下声明的
set -- --help --checkout foo 1 2 3 4

declare -A misc

zparseopts -E -D -K \
        -A misc \
        '-checkout:' \
        h \
        -help

for k v in ${(@kv)misc}; do
    echo flag $k: $v
done

echo "argv $@"

这应该打印出来

flag --help:
flag --checkout: foo
argv 1 2 3 4

而是打印成 --help 接受了一个论点。我是否错误地使用了 -A 和关联数组?

flag --help: --checkout
flag foo:
argv: 1 2 3 4

原来 zparseopts 正在做你想要的。问题是 后面的 echo 语句没有正确显示关联数组中的键和值。

zsh 不同寻常的是,您需要更多引文。尝试用这个替换 for 循环:

printf 'flag %s: %s\n' "${(kv@)misc}"

真正的修复是双引号与 @ 参数扩展标志配对;这确保空值将被视为结果中的单独单词。 printf 只是循环遍历键值对的一种较短的方法。

您还可以使用 typeset:

显示关联数组(或几乎任何变量)的值
typeset '@' 'misc'