这是我的代码,用于循环遍历冒号分隔的值,并对每个值执行某些操作。
但是在zsh中,它并没有按照预期的方式工作。
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标准?
read -r -a args <<<"$1"
或类似的方法读入数组,然后使用for arg in "${args[@]}"; do ...
。 - Charles Duffyzsh
做了 POSIX 应该做的事情,如果 POSIX 没有尽可能地维护现有行为,那么它就会这样做。作为最糟糕的解决方案,您可以使用setopt SH_WORD_SPLIT
来恢复 POSIX 的行为。 - chepner