参数扩展后,zsh不会被IFS拆分

时间:2017-09-20 05:28:14

标签: bash shell posix zsh ifs

这是我的代码循环冒号分隔值并执行某些操作 每个值。

f()
{
    IFS=:
    for arg in $1
    do
        echo arg: $arg
    done
}

f foo:bar:baz

这在大多数符合POSIX标准的shell中都能正常工作。

$ dash foo.sh
arg: foo
arg: bar
arg: baz
$ bash foo.sh
arg: foo
arg: bar
arg: baz
$ ksh foo.sh
arg: foo
arg: bar
arg: baz
$ posh foo.sh
arg: foo
arg: bar
arg: baz
$ yash foo.sh
arg: foo
arg: bar
arg: baz

但它在zsh中无法正常工作。

$ zsh foo.sh
arg: foo:bar:baz

zsh是否违反了POSIX

2 个答案:

答案 0 :(得分:2)

是。 Zsh选择了自己的方式。

这是zsh faq条目: “3.1: Why does $var where var="foo bar" not do what I expect?”

在这种特殊情况下,您可以通过向zsh调用添加-y选项来解决此问题:

$ zsh -y foo.sh
arg: foo
arg: bar
arg: baz

您可以查看the zsh's faq,尤其是第2章和第3章。 你经历过的其他炮弹越多,就越能找到zsh的陷阱。

答案 1 :(得分:1)

在Zsh中,使用提供的.tbl标志进行拆分通常比较清晰(使用(s))。 然后,您的数据解决方案将是:

IFS

请参阅% f() { for e in ${(s.:.)1}; print $e } % f foo:bar:baz foo bar baz 手册页中的 PARAMETER EXPANSION 部分 更多细节和相关标志。

(我假设你的意思是冒号 - 分离的值。)