Lon*_*ner 5 bash shell posix zsh ifs
这是我的代码,用于遍历冒号分隔的值并对每个值执行某些操作。
f()
{
IFS=:
for arg in $1
do
echo arg: $arg
done
}
f foo:bar:baz
Run Code Online (Sandbox Code Playgroud)
这在大多数符合 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
Run Code Online (Sandbox Code Playgroud)
但它在 zsh 中没有按预期工作。
$ zsh foo.sh
arg: foo:bar:baz
Run Code Online (Sandbox Code Playgroud)
zsh这里是否违反了POSIX?
是的。Zsh选择了自己的方式。
\n\n这是 zsh 常见问题解答条目:\n \xe2\x80\x9c3.1: 为什么 $var where var="foo bar" 没有达到我的预期?\xe2\x80\x9d
\n\n在这种特殊情况下,您可以通过将该-y选项添加到zsh来解决此问题:
$ zsh -y foo.sh\narg: foo\narg: bar\narg: baz\nRun Code Online (Sandbox Code Playgroud)\n\n你可以看看zsh 的常见问题解答,尤其是第 2 章和第 3 章。\n你体验其他 shell 的次数越多,你就越能发现 zsh 的陷阱。
\n