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

Suz*_*ioc 14 syntax bash shell

这是什么意思?

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

看起来ac_cv_lib_lept_pixCreate是一些变量,所以+:意味着什么?

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

Hen*_*eld 19

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

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

if ${var+:} false; then ...
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

if [[ ${var+"is_set"} == is_set ]]; then ...
Run Code Online (Sandbox Code Playgroud)

或者,可能更便携:

case ${var+"IS_SET"} in IS_SET) ...;; esac
Run Code Online (Sandbox Code Playgroud)

  • 如果你想知道,autoconf这样做是因为:并非所有的shell都支持`[[...]]`语法,旧的`[...]```test ...`机制令人头疼 - 在传统Unix中引入可变性的数量并且可能没有内置(减慢速度),最后,方括号在autoconf代码中使用字面意思是很痛苦,因为它们被重新用于M4引用. (2认同)

nic*_*rim 11

这里有关于bash的Shell参数扩展文档.没有提及+:,尽管它确实提到:+:

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

  • 不完全可选,但可以省略它以提供略微不同的含义.`$ {var:+:}`扩展为`:`如果`var`未设置或为null.只有当`var`未设置时,`$ {var +:}`才会扩展为`:`,如果它有空值则不会. (8认同)
  • 扩展运算符的无冒号版本通常用`省略冒号结果仅针对未设置的参数进行测试.在描述运算符列表之前. (4认同)
  • @chepner我认为你的意思是如果 var 不是(未设置或 null ),则 `${var:+:}` 扩展为 `:` ;同样,如果 var 未设置,则 `${var+:}` 会扩展为 `:`。 (2认同)

Sir*_*hos 5

为了说明已经说过的话:

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

$ unset foo
$ echo ${foo}

$ echo ${foo:+:}

$ echo ${foo+:}
Run Code Online (Sandbox Code Playgroud)

空变量:

$ foo=""
$ echo ${foo}

$ echo ${foo:+:}

$ echo ${foo+:}
:
Run Code Online (Sandbox Code Playgroud)

非null变量:

$ foo="bar"
$ echo ${foo}
bar
$ echo ${foo:+:}
:
$ echo ${foo+:}
:
Run Code Online (Sandbox Code Playgroud)