在shell脚本表达式中,“加冒号”(“+:”)的含义是什么?

时间:2013-09-30 15:12:47

标签: bash shell syntax

这是什么意思?

if ${ac_cv_lib_lept_pixCreate+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS

看起来ac_cv_lib_lept_pixCreate是一些变量,那么+:是什么意思?

在哪里学习大括号表达式的完整语法?这个语法的名称是什么?

4 个答案:

答案 0 :(得分:19)

在“加冒号”${...+:}表达式中,只有+在shell中具有特殊含义。在这种情况下,冒号只是一个字符串值,因此我们可以将该代码段写为${...+":"}

为方便起见,让我们假装变量名为var,并考虑表达式:

if ${var+:} false; then ...

如果shell变量$var存在,则整个表达式将替换为:,否则返回空字符串。

因此整个表达式${var+:} false变为: false(返回true)或false(返回false)。

这归结为存在的测试,即使变量没有赋值,也可以为真。

它非常神秘,但实际上,它是少数几个测试中存在变量的测试之一,它实际上适用于Bourne血统的大多数(如果不是全部)炮弹。

可能的等价物:(在此替换var的任何变量名称)

if [[ ${var+"is_set"} == is_set ]]; then ...

或者,可能更便携:

case ${var+"IS_SET"} in IS_SET) ...;; esac

答案 1 :(得分:9)

bash的Shell参数扩展文档是here。没有提及+:,但确实提到了:+

  

${parameter:+word}
  如果参数为null或未设置,则不替换任何内容,否则将替换word的扩展。

答案 2 :(得分:5)

说明已经说过的话:

取消设置变量(请注意某些echo命令导致的空行):

$ unset foo
$ echo ${foo}

$ echo ${foo:+:}

$ echo ${foo+:}

空变量:

$ foo=""
$ echo ${foo}

$ echo ${foo:+:}

$ echo ${foo+:}
:

非空变量:

$ foo="bar"
$ echo ${foo}
bar
$ echo ${foo:+:}
:
$ echo ${foo+:}
:

答案 3 :(得分:2)

简单的例子将证明

我检查是否存在参数TEST,如果存在回声“是”,否则我回显“否”

openvas:~$ ${TEST+:} false  &&  echo "yes" || echo "no"
no
openvas:~$ TEST=1
openvas:~$ ${TEST+:} false  &&  echo "yes" || echo "no"
yes
openvas:~$ 

如果你看到,参数TEST被评估并且它实际上是未设置的,所以它返回false并退出路径并转到OR 一旦我设置相同,并再次测试,它会流向回声部分(续&&),因为它返回true

参考:thisthat