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吗?

4

1 回答 1

5

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

由于 non_exec 模式 ( -n) 不执行任何操作,因此它不执行typeset所以bar不是“关联数组”,并且分配无效。

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

Zsh 邮件列表:zsh -n 不 grok 关联数组索引?(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 年的“新闻”!)

于 2012-11-16T13:24:55.490 回答