Zsh 将关联数组与zparseopts一起使用

Zsh 将关联数组与zparseopts一起使用,zsh,Zsh,我试图使用关联数组来解析带有zparseopts的选项 我有一些工作代码,在下面分享,使用普通数组…但它太笨拙和冗长了。我只想通过将-A作为我的选项传递给zparseopts来询问-f是否使用opts作为关联数组存在,但我似乎无法使其工作 local -a opts zparseopts -D -a opts f if [[ ${opts[(ie)-f]} -le ${#opts} ]]; then echo "force was passed" else echo "be kind"

我试图使用关联数组来解析带有zparseopts的选项

我有一些工作代码,在下面分享,使用普通数组…但它太笨拙和冗长了。我只想通过将
-A
作为我的选项传递给
zparseopts
来询问
-f
是否使用
opts
作为关联数组存在,但我似乎无法使其工作

local -a opts
zparseopts -D -a opts f
if [[ ${opts[(ie)-f]} -le ${#opts} ]]; then
  echo "force was passed"
else
  echo "be kind"
fi
谢谢你的帮助

当关联数组使用
(i)
下标标志时,如果找到匹配项,则替换将返回键,如果未找到匹配项,则返回空值。因此,您只需要测试非空字符串:

local -A opts
zparseopts -D -A opts f
if [[ -n ${opts[(ie)-f]} ]]; then
  echo "force was passed"
else
  echo "be kind"
fi
为了整合选项解析,我使用了以下(稍微隐晦的)替换:

flag=-f; force=${${:-true false}[(w)((${#opts[(i)$flag]}>0?1:2))]}
flag=-q; quiet=${${:-true false}[(w)((${#opts[(i)$flag]}>0?1:2))]}

...

if $force; then
    ...

if ! $quiet; then
    ...