/ bin / sh中的$ {1:+“$ @”}

时间:2008-09-30 19:41:08

标签: shell

我注意到有时包装器脚本会使用${1:+"$@"}作为参数,而不仅仅是"$@"

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

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

任何人都可以将${1:+"$@"}分解为英语并解释为什么它比普通"$@"更有优势吗?

3 个答案:

答案 0 :(得分:18)

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

JesperE(或Bash手册页)的解释对于它的作用是准确的:

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

20年左右之前,如果没有参数,Bourne Shell的一些破碎的小变体将“$ @”替换为空字符串“”,而不是替换正确的当前行为。是否有任何此类系统仍在使用中尚待辩论。

[嗯:扩展无法正常工作:

command '' arg2 arg3 ...

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

${1+"$@"}

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

答案 1 :(得分:3)

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

  

当不执行子字符串扩展时,bash测试 unset或null 的参数; 省略冒号会导致取消设置的参数只测试

(强调我的)

答案 2 :(得分:2)

来自bash手册页:

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

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