在shell脚本中为什么要使用${@+"$@"}?

6
一个例子:
foo() {
    for i in ${@+"$@"}; do
        echo $i
    done
}

我了解${parameter+word}的含义是如果设置了parameter,则展开word。但为什么不直接使用for i in "$@"; do呢?我相信这样做有一些好处,但有没有人可以举个例子呢?
谢谢!

我认为(但无法确认)这是一种解决某些不正确处理$@的shell的方法。 - chepner
2个回答

6
根据POSIX标准,如果未设置$@,则"$@"应该扩展为空。然而,原始的Bourne shell将其扩展为单个空字符串。${@+"$@"}在任一shell中,如果$@未设置,则会扩展为空。
来源:http://www.in-ulm.de/~mascheck/various/bourne_args/

3
澄清一下:这个机制曾经是必要的,但它已经成为过去时代的遗物。 - William Pursell
“foregone”?也许是“bygone”。我不知道为什么我没有直接说它已经过时了。如果您在Solaris 2.8上使用/bin/sh,这种情况可能仍然需要,但那已经是几年前的事了。(2008年?) - William Pursell
谢谢!这对我来说很清楚了。它来自于一个在旧的HP-UX上使用的脚本,这解释了需要的原因。 - Klaus

-1

$@为空字符串""时,${@+"$@"}不产生任何内容,但"$@"会产生"",请检查:

foo() {
    for i in ${@:+"$@"}; do
        echo XXX: $i
    done
}

bar() {
    for i in "$@"; do
        echo XXX: $i
    done
}

echo foo:
foo ""
echo bar:
bar ""

foo 不调用 echo,但 bar 调用它


foo没有调用echo,因为您使用了${@:+"$@"}而不是${@+"$@"}(您在扩展中添加了冒号)。省略冒号,foo的行为与bar相同。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接