【问题标题】:What is the meaning of opts=${1:+--host $1} in bash? [duplicate]bash中opts=${1:+--host $1}是什么意思? [复制]
【发布时间】:2019-10-29 02:58:25
【问题描述】:

在一个 bash 脚本中,我偶然发现了这段代码:

opts=${1:+--host $1}
/path/somecmd $opts somesubcmd

通过测试,我发现$opts 扩展为--host $1 无论$1 是什么。
我想知道这种语法的目的是什么。 为什么不直接使用opts="--host $1"

这是将选项传递给命令的特定方式吗?

【问题讨论】:

  • Here 是关于${...} 所做工作的一个很好的参考

标签: bash parameter-expansion positional-parameter


【解决方案1】:

如果variable 非空,则参数扩展${variable:+value} 生成value,否则不生成。所以这是一种表示“如果设置了$1,则添加--host $1”的方式。 (扩展应该正确引用字符串;${1:+--host "$1~}

【讨论】:

    【解决方案2】:

    作为bash manual says

    ${<em>parameter</em>:+<em>word</em>}

    如果parameter 为null 或未设置,则不替换任何内容,否则替换word 的扩展。

    当 bash 手册说“参数”时,它的意思是“变量”。当它说“null”时,它的意思是“空字符串”。

    换句话说,${foo:+bar} 的工作方式类似于 bar,但前提是 $foo 不为空。

    在你的情况下,

    ${1:+--host $1}
    

    它检查$1。如果 $1 未设置或为空,则整个构造将扩展为空。

    如您所见,否则它会扩展为 --host $1

    【讨论】:

      【解决方案3】:

      由于+,它会将--host 添加到第一个参数之前,但前提是$1 不为空。

      $ function mytest { echo ${1:+--host $1}; }
      $ mytest ls
      --host ls
      $ mytest ""
      
      

      等价于:

      $ function mytest { [ -z "$1"] || echo --host $1; }
      $ mytest ls
      --host ls
      

      关于shell parameter expansion 的内容很多。

      【讨论】:

        猜你喜欢
        • 2014-04-08
        • 2016-12-10
        • 1970-01-01
        • 1970-01-01
        • 2015-09-27
        • 2020-04-11
        • 1970-01-01
        • 2016-08-18
        • 1970-01-01
        相关资源
        最近更新 更多