我注意到有时包装器脚本会使用${1:+"$@"}
作为参数,而不仅仅是"$@"
。
例如,http://svn.macosforge.org/repository/macports/trunk/dports/editors/vim-app/files/gvim.sh使用
exec "$binary" $opts ${1:+"$@"}
任何人都可以将${1:+"$@"}
分解为英语并解释为什么它比普通"$@"
更有优势吗?
答案 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
将被替换。我不明白为什么他们不能只使用"$@"
。