这是什么意思?
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
是一个变量,那么+:
代表什么?
在哪里学习完整的花括号表达式语法?这种语法的名称是什么?
这是什么意思?
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
是一个变量,那么+:
代表什么?
在哪里学习完整的花括号表达式语法?这种语法的名称是什么?
+
在 shell 中具有特殊意义。 在这种情况下,冒号只是一个字符串值,因此我们可以将该片段编写为 ${...+":"}
。 但是,因为它也是 shell 命令列表中的第一个单词,它成为了始终返回 true 的“命令”:
。if
语句变成了if true false;
或if false;
。
让我们来分解一下:
为了方便起见,假设变量被称为var
,并考虑表达式:
if ${var+:} false; then ...
如果 shell 变量 $var
存在,则整个表达式将被替换为 :
;如果不存在,则返回一个空字符串。
因此,整个表达式 ${var+:} false
将变为 : false
(返回 true),或者是 false
(返回 false)。
这实际上是一种存在性测试,即使变量没有分配任何值也可以是 true。
尽管非常神秘,但事实上它是少数在大多数 Bourne 衍生 shell 中实际有效的变量存在性测试之一。
可能等价的表达式:(用任何变量名替换var
)
if [[ ${var+"is_set"} == is_set ]]; then ...
或者,可能更具可移植性:
case ${var+"IS_SET"} in IS_SET) ...;; esac
[[ ... ]]
语法,旧的[ ... ]
也被称为test ...
机制在传统Unix系统上有大量变化,并且可能没有内置(会减慢速度),最后,方括号在autoconf代码中直接使用会很麻烦,因为它们被用于M4引号。 - zwolautoconf
需要考虑所有可能的 shell。我喜欢我的一些巧妙编码,但是尝试将特殊构造包装在函数中以隔离并解释其用途 - 对于这种情况来说行不通。 - Henk Langeveld[ "${var+fnord}" ]
如果 var
已设置,则返回 true。 - tripleee对于bash的Shell参数扩展文档,请点击此处。没有提及+:
,但提到了:+
:
${parameter:+word}
如果parameter为空或未设置,则不会替换为任何内容,否则将替换为word的展开结果。
${var+:}
表示“如果$var
被设置为任何值,则在此处替换冒号,否则不进行替换”。 - jthill${var:+:}
会展开为:
,如果var
未设置或为空。${var+:}
只有在var
未设置时才会展开为:
,而不是当它具有空值时。 - chepner${var:+:}
会在变量不为空或未设置时扩展为:
;同样,${var+:}
会在变量未设置时扩展为:
。 - Henk Langeveld${var:-}
运算符,整个带/不带冒号的事情对我来说更有意义,当 ${var:+}
在某种意义上是反向运算符时,我会感到困惑。 - chepner为了说明已经说过的内容:
未设置的变量(请注意某些echo
命令的结果是空行):
$ unset foo
$ echo ${foo}
$ echo ${foo:+:}
$ echo ${foo+:}
Null变量:
$ foo=""
$ echo ${foo}
$ echo ${foo:+:}
$ echo ${foo+:}
:
非空变量:
$ foo="bar"
$ echo ${foo}
bar
$ echo ${foo:+:}
:
$ echo ${foo+:}
:
${TEST} false && echo "yes" || echo "no"
也会打印出no。因此,这并没有准确定位 +: 加入到混合中所起的作用。 - ychaouche