这是我的代码循环冒号分隔值并执行某些操作 每个值。
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?
答案 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 部分
更多细节和相关标志。
(我假设你的意思是冒号 - 分离的值。)