为什么这个代码在传递给`zsh -n`而不是`zsh`时会抛出错误?

时间:2012-11-16 03:09:53

标签: zsh

我正在尝试在此示例中将所有值从一个关联数组复制到另一个关联数组。我正在使用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 个答案:

答案 0 :(得分:5)

您可以通过添加调试模式(-x

来查看正在发生的事情

由于non_exec模式(-n)不执行任何操作,因此它不执行typeset,因此bar不是“关联数组”,并且赋值不是有效的。

我看到“垃圾”行(或其他看起来像命令的行)的存在阻止了程序进入“for”循环。

Zsh mailing list: 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可用)
News about zsh(包括1997年的“新闻”!)