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'
看来我一定是用错了 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'