【问题标题】:${1:+"$@"} in /bin/sh/bin/sh 中的 ${1:+"$@"}
【发布时间】:2010-09-14 08:29:55
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: shell


    【解决方案1】:

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

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

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

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

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

    command '' arg2 arg3 ...
    

    在这种情况下,正确的符号是:

    ${1+"$@"}
    

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

    【讨论】:

    • 啊哈。是的,至少根据google.com/codesearch,您提到的符号更为常见。我看到 ${1+"$@"}(即没有冒号)有 191,000 个结果,而 ${1:+"$@"} 有 173 个结果。当然,“man bash”的引用有一个冒号。所以也许使用冒号不是一个错误。 . .
    • 冒号是一个不同的测试 - 它正在寻找一个非空字符串。它最常与必须具有值的环境变量一起使用:${ENVVAR:+"-value=$ENVVAR"} 或其他。仅当 ENVVAR 设置为非空字符串时,才会创建 -value=whatever 参数。
    【解决方案2】:

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

    当不执行子字符串扩展时,bash 测试一个参数是否为 unset 或 null省略冒号会导致测试未设置的参数。

    (强调我的)

    【讨论】:

      【解决方案3】:

      来自 bash 手册页:

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

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

      【讨论】:

      • 顺便说一句:当涉及到诸如此类的问题时,bash 手册页确实是您的朋友。这可能是我最常使用的手册页。
      • 你是对的'man bash'。抱歉,我也找到了该引用,但未将其包含在我的问题中。我同意他们可能只是使用了 "$@" 但必须有 ${1:+"$@"} 的原因。 . .也许我们会发现。 :)
      • 我也不排除巫毒编程。 ;-)
      猜你喜欢
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 2020-11-23
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多