为什么将此代码传递给`zsh -n`会抛出错误,但传递给`zsh`不会?

3

在这个例子中,我试图将一个关联数组的所有值复制到另一个数组中。我使用zsh -n检查我的代码是否有语法错误,但是它会抛出一个test:12: bar: assignment to invalid subscript range的错误。

#!/usr/bin/env zsh
typeset -A foo bar
foo=(
    Adama   "Commander"
    Tigh    "Executive Officer"
    Roslin  "President"
)
bar=()

for i in ${(k)foo}; do
    # "rubbish"
    bar[$i]=$foo[$i]
done

如果我取消注释# "rubbish这一行,zsh -n就不会再抱怨了。是我的代码有问题还是zsh -n有问题?

1个回答

5
您可以通过添加调试模式 (-x) 来查看运行情况。
由于非执行模式 (-n) 不执行任何操作,因此它不会执行 typeset,所以 bar 不是 "关联数组",赋值无效。
我发现存在 "垃圾" 行(或其他看起来像命令的行)会阻止程序进入 'for' 循环。
参考链接:Zsh邮件列表: zsh -n doesn't grok associate array indexes? (2011年1月)
我尝试了使用 zsh 4.3.12,行为更加一致,使用 -n 后程序永远不会进入 'for' 循环。
对于一个没有循环的较小程序:
#!/usr/bin/env zsh
typeset -A bar
bar[test]=testons
echo $bar

在执行程序方面,zsh 4.3.10和4.3.12将以相同的方式进行,但是zsh-4.3.10 -n错误地报告了一个错误(赋值到无效的下标范围),而zsh-4.3.12 -n则不会。

因此,建议使用zsh 4.3.12(或更新的版本。我发现ZSH 5已经发布)
关于zsh的最新消息(包括1997年以来的“新闻”!)


感谢详细的解释,它让我了解了幕后发生的事情。我会升级我的zsh版本。 - pixelastic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接