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

为什么这段代码在传递给'zsh-n'而不是'zsh'时会抛出错误?,zsh,Zsh,在本例中,我尝试将所有值从一个关联数组复制到另一个关联数组。我正在使用zsh-n检查代码的语法错误,但是这一次抛出了一个测试:12:bar:赋值到无效的下标范围 #!/usr/bin/env zsh typeset -A foo bar foo=( Adama "Commander" Tigh "Executive Officer" Roslin "President" ) bar=() for i in ${(k)foo}; do # "rubbi

在本例中,我尝试将所有值从一个关联数组复制到另一个关联数组。我正在使用
zsh-n
检查代码的语法错误,但是这一次抛出了一个
测试:12:bar:赋值到无效的下标范围

#!/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

如果我取消注释
#“垃圾”
行,
zsh-n
停止抱怨。我的代码或
zsh-n
是否有问题?

您可以通过添加调试模式(
-x
)来查看发生了什么

由于非执行模式(
-n
)不执行任何操作,因此它不执行
排版
,因此
不是“关联数组”,且赋值无效

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

(2011年1月)

我试过使用ZSH4.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可用)

(包括1997年的“新闻”!

感谢您的详细解释,它很好地展示了幕后的情况。我将升级我的zsh版本。