【发布时间】:2017-09-20 05:28:14
【问题描述】:
这是我循环遍历冒号分隔值并执行某些操作的代码 每个值。
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了吗?
【问题讨论】:
-
是的,zsh 在这里是故意和故意违反的。也就是说,在 any shell 中依赖字符串拆分并不是一个好习惯——即使在 bash 中,我也鼓励您使用
read -r -a args <<<"$1"或类似的方式读取数组,然后使用 @ 987654326@ -
这是
zsh做了 POSIX 应该 做的事,它没有尽可能地维护现有行为的负担。作为最糟糕的解决方案,您可以使用setopt SH_WORD_SPLIT来恢复 POSIX 行为。