旧版本 zsh 中的 zparseopts 与关联数组

旧版本 zsh 中的 zparseopts 与关联数组

zparseopts我对两个不同版本的 zsh的不同行为感到困惑。基本上,我试图在关联数组中设置默认选项值列表,并使用命令行上指定的任何选项覆盖这些默认值。下面的代码在 zsh 5.0.6 上运行良好,但在 4.3.6 上表现得很奇怪——具体来说,在 zsh 4.3.6 中,如果覆盖单个键,我的整个默认值数组都会被覆盖。

脚本

typeset -A opts
opts=(
--opt1 a
--opt2 b
)

zparseopts -A opts -K -- -opt1: -opt2:
echo ${(k)opts}

运行脚本

$ myscript 
--opt1 --opt2  # both zsh 4.3.6 and 5.0.6

$ myscript --opt1 x
--opt1 --opt2  # zsh 5.0.6; element of array is replaced
--opt1         # zsh 4.3.6; adding an element overwrites the whole array, no more opt2

这种行为令人困惑,因为 4.3.6 和 5.0.6 具有相同的选项-K条目zparseopts

-K 使用此选项,当不使用任何规范时,使用 -a 和 -A 选项以及 `=array' 形式指定的数组将保持不变。这允许在调用 zparseopts 之前为它们分配默认值。

答案1

将脚本的最后一行替换为echo ${(kv)opts}.使用 4.3.6 和 5.0.6 运行应该显示 4.3.6 解释-K为重置opts,如果任何给出了选项,而仅在使用时5.0.6重置(保留或任何其他条目)。opts[--opt1]--opt1--opt2

(请注意,这似乎在 5.0.2 和 5.0.6 之间的某个时间发生了变化;您可能需要在 zsh-workers 邮件列表上询问以确认。)=

相关内容