0

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

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

通过测试,我发现它可以$opts扩展到--host $1任何东西$1
我想知道这种语法的目的是什么。为什么不简单地使用opts="--host $1"

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

4

3 回答 3

0

由于 ,它会--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 参数扩展的内容。

于 2019-06-14T13:27:33.543 回答
0

正如bash 手册所说

${parameter:+word}

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

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

换句话说,${foo:+bar}像 一样工作bar,但前提$foo是不为空。

在你的情况下,

${1:+--host $1}

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

否则,它会扩展为--host $1,正如您所观察到的。

于 2019-06-14T13:36:29.230 回答
0

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

于 2019-06-14T13:37:10.070 回答