这是什么意思?
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是一个变量,那么+:是什么意思?在哪里学习花括号表达式的完整语法?这个语法的名字是什么?
ac_cv_lib_lept_pixCreate
+:
pxy2qtax1#
在“plus colon”${...+:}表达式中,只有+在shell中有特殊的含义。在这种情况下,冒号只是一个字符串值,所以我们可以将该片段写成${...+":"}。但是,因为它也是shell命令列表中的第一个单词,所以它变成了 command:,它总是返回 true。根据变量是否有值的问题,if语句将变为if true false;或if false;。让我们来分解一下:为了方便起见,假设变量名为var,并考虑表达式:
${...+:}
+
${...+":"}
:
if
if true false;
if false;
var
if ${var+:} false; then ...
如果shell变量$var存在,则整个表达式将替换为:,如果不存在,则返回空字符串。因此,整个表达式${var+:} false变为: false(返回true)或false(返回false)。这归结为存在性测试,即使变量没有赋值,它也可以为真。这是非常神秘的,但它碰巧是少数几个测试一个变量的存在,实际上在大多数,如果不是全部,伯恩血统的 shell 。可能的等同物:(将此处的任何变量名称替换为var)
$var
${var+:} false
: false
false
if [[ ${var+"is_set"} == is_set ]]; then ...
或者,可能更便携:
case ${var+"IS_SET"} in IS_SET) ...;; esac
tpxzln5u2#
bash的Shell参数扩展文档是here。没有提到+:,尽管它提到了:+:${parameter:+word}如果参数为null或未设置,则不替换任何内容,否则替换word的扩展。
:+
${parameter:+word}
jobtbby33#
为了说明已经说过的话:取消设置变量(注意一些echo命令导致的空行):
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+:} :
bksxznpy4#
简单的例子就能证明我检查参数TEST是否存在,如果存在则回显“是”,否则我回显“否”
openvas:~$ ${TEST+:} false && echo "yes" || echo "no" no openvas:~$ TEST=1 openvas:~$ ${TEST+:} false && echo "yes" || echo "no" yes openvas:~$
如果你看到,参数TEST被求值,它实际上是未设置的,所以它返回false并退出路径并转到OR一旦我设置了相同的值,并再次测试,它流向echo部分(续&&),因为它返回true参考:this和that
4条答案
按热度按时间pxy2qtax1#
在“plus colon”
${...+:}
表达式中,只有+
在shell中有特殊的含义。在这种情况下,冒号只是一个字符串值,所以我们可以将该片段写成${...+":"}
。但是,因为它也是shell命令列表中的第一个单词,所以它变成了 command:
,它总是返回 true。根据变量是否有值的问题,
if
语句将变为if true false;
或if false;
。让我们来分解一下:
为了方便起见,假设变量名为
var
,并考虑表达式:如果shell变量
$var
存在,则整个表达式将替换为:
,如果不存在,则返回空字符串。因此,整个表达式
${var+:} false
变为: false
(返回true)或false
(返回false)。这归结为存在性测试,即使变量没有赋值,它也可以为真。
这是非常神秘的,但它碰巧是少数几个测试一个变量的存在,实际上在大多数,如果不是全部,伯恩血统的 shell 。
可能的等同物:(将此处的任何变量名称替换为
var
)或者,可能更便携:
tpxzln5u2#
bash的Shell参数扩展文档是here。没有提到
+:
,尽管它提到了:+
:${parameter:+word}
如果参数为null或未设置,则不替换任何内容,否则替换word的扩展。
jobtbby33#
为了说明已经说过的话:
取消设置变量(注意一些
echo
命令导致的空行):空变量:
非空变量:
bksxznpy4#
简单的例子就能证明
我检查参数TEST是否存在,如果存在则回显“是”,否则我回显“否”
如果你看到,参数TEST被求值,它实际上是未设置的,所以它返回false并退出路径并转到OR一旦我设置了相同的值,并再次测试,它流向echo部分(续&&),因为它返回true
参考:this和that