28

我注意到有时包装脚本将${1:+"$@"}用于参数,而不仅仅是"$@".

例如,http://svn.macosforge.org/repository/macports/trunk/dports/editors/vim-app/files/gvim.sh使用

exec "$binary" $opts ${1:+"$@"}

谁能分解${1:+"$@"}成英语并解释为什么它比普通话更有优势"$@"

4

3 回答 3

26

“歇斯底里的葡萄干”,又名历史原因。

JesperE(或关于shell 参数扩展的 Bash 手册页)的解释对于它的作用是准确的:

  • 如果$1存在且不是空字符串,则替换引用的参数列表。

大约 20 年前,Bourne Shell 的一些损坏的次要变体在没有参数的情况下替换了一个空字符串,而不是当前的正确行为,即什么都不替换"""$@"是否有任何这样的系统仍在使用中,还有待商榷。

[嗯:该扩展不适用于:

command '' arg2 arg3 ...

在这种情况下,正确的表示法是:

${1+"$@"}

$1无论是否为空参数,这都能正常工作。所以,有人记错了符号,不小心引入了一个错误。]

于 2008-09-30T20:50:37.663 回答
3

从 bash 手册页:

   ${parameter:+word}
          Use Alternate Value.  If parameter is null or unset, nothing  is
          substituted, otherwise the expansion of word is substituted.

因此,"$@"被替换,除非$1未设置。我不明白为什么他们不能使用"$@".

于 2008-09-30T19:43:48.963 回答
3

引用Jonathan Leffler在评论中提到man bash的信息的相关部分:

不执行子字符串扩展时,bash 测试未设置或 null的参数;省略冒号会导致仅对未设置的参数进行测试。

(强调我的)

于 2009-10-21T16:03:17.890 回答