Shell ${1:in/bin/sh中的“&”x2B“$@”
我注意到,有时包装器脚本将使用Shell ${1:in/bin/sh中的“&”x2B“$@”,shell,Shell,我注意到,有时包装器脚本将使用${1:+“$@”}作为参数,而不仅仅是“$@” 例如,使用 有人能把${1:+“$@”}分解成英文,并解释为什么它比普通的“$@”有优势吗?来自bash手册页: ${parameter:+word} Use Alternate Value. If parameter is null or unset, nothing is substituted, otherwise the expansion of word i
${1:+“$@”}
作为参数,而不仅仅是“$@”
例如,使用
有人能把
${1:+“$@”}
分解成英文,并解释为什么它比普通的“$@”
有优势吗?来自bash手册页:
${parameter:+word}
Use Alternate Value. If parameter is null or unset, nothing is
substituted, otherwise the expansion of word is substituted.
因此,
“$@”
将被替换,除非未设置$1
。我不明白为什么他们不能仅仅使用“$@”“歇斯底里的葡萄干”,也就是历史原因
JesperE(或上的Bash手册页)对其功能的解释是准确的:
- 如果
存在且不是空字符串,则替换引用的参数列表$1
“
替换”$@“
,而不是当前正确的不替换任何内容的行为。是否有任何此类系统仍在使用中有待讨论
[Hmm:对于以下情况,该扩展无法正常工作:
command '' arg2 arg3 ...
在这种情况下,正确的表示法是:
${1+"$@"}
无论
$1
是否为空参数,这都是正确的。因此,有人错误地记住了表示法,意外地引入了一个错误。]引用man bash
的相关部分,以了解Jonathan Leffler在其评论中提到的信息:
当不执行子字符串扩展时,bash测试未设置或为null的参数省略冒号只会对未设置的参数进行测试
(我的重点)顺便说一句:当遇到这样的问题时,bash手册页真的是你的朋友。这可能是我最常使用的手册页。你说的“ManBash”是对的。对不起,我也找到了那句话,但没有包括在我的问题中。我同意他们可能只是使用了“$@”,但“${1:+”$@}”肯定是有原因的。也许我们会发现。:)我也不排除巫毒编程的可能性啊哈。是的,至少根据你提到的符号,它更常见。我看到${1+“$@”}有191000个结果(即没有冒号),而${1:+“$@”有173个结果。当然,“ManBash”中的引语有一个冒号。所以也许使用冒号不是一个错误。冒号是一个不同的测试-它正在寻找一个非空字符串。它最常用于必须具有值:${ENVVAR:+“-value=$ENVVAR”}或其他值的环境变量。只有当ENVVAR设置为非空字符串时,才会创建-value=whatever参数。
${1+"$@"}