19

这是什么意思?

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

4 回答 4

26

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

为方便起见,假设变量被调用var,并考虑表达式:

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

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

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

这归结为存在性测试,即使变量没有分配值,这也可能是真的。

它非常神秘,但碰巧它是少数几个测试是否存在一个变量,该变量实际上在大多数(如果不是全部)Bourne 血统的 shell 中有效。

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

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

或者,可能更便携:

case ${var+"IS_SET"} in IS_SET) ...;; esac
于 2013-09-30T15:42:18.097 回答
16

bash 的 Shell 参数扩展文档在这里。没有提到+:,虽然它确实提到:+

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

于 2013-09-30T15:36:31.643 回答
8

为了说明已经说过的话:

未设置变量(注意某些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+:}
:
于 2013-09-30T16:24:10.390 回答
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 一旦我设置相同并再次测试,它会流向回显部分(续 &&),因为它返回真

参考这个那个

于 2013-09-30T15:41:29.080 回答