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

时间:2013-07-05 11:53:21

标签: linux posix sh

一个例子:

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

我了解如果${parameter+word}设置为wordparameter会导致扩展for i in "$@"; do。但为什么不使用{{1}}?我确信有一些好处,但有人可以举个例子吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

根据POSIX标准,如果未设置"$@"$@应扩展为空。但是,原始Bourne shell将其扩展为单个空字符串。如果未在任何一个shell中设置${@+"$@"}$@将展开为空。

来源:http://www.in-ulm.de/~mascheck/various/bourne_args/

答案 1 :(得分:-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会调用它