Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell ${1:in/bin/sh中的“&”x2B“$@”_Shell - Fatal编程技术网

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
    存在且不是空字符串,则替换引用的参数列表
大约20年前,如果没有参数,Bourne Shell的一些损坏的次要变体用空字符串
替换
”$@“
,而不是当前正确的不替换任何内容的行为。是否有任何此类系统仍在使用中有待讨论

[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+"$@"}