shell脚本表达式中的“加号”(“+:”)是什么意思?

问题描述 投票:0回答:4

这是什么意思?

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
是一些变量,那么
+:
是什么意思?

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

bash shell syntax
4个回答
29
投票

在“加号”

${...+:}
表达式中,只有
+
在shell 中具有特殊含义。在这种情况下,冒号只是一个字符串值,因此我们可以将该片段写为
${...+":"}
。但是,因为它也是 shell 命令列表中的第一个单词,所以它成为 command
:
总是返回 true.

根据变量是否有值的问题,

if
语句变为
if true false; 
if false; 
.


让我们分解一下:

为方便起见,假设变量名为

var
,并考虑表达式:

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

如果shell变量

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

因此整个表达式

${var+:} false
变成
: false
(返回真)或
false
(返回假)。

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

它非常神秘,但碰巧的是,它是为数不多的测试变量是否存在的测试之一,该变量实际上适用于大多数(如果不是全部)伯恩血统的外壳。

可能的等价物:(在这里用任何变量名代替

var

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

或者,可能更便携:

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

18
投票

bash 的 Shell 参数扩展文档在这里。没有提到

+:
,虽然它确实提到了
:+

${parameter:+word}

如果参数为空或未设置,则不替换任何内容,否则替换单词的扩展。


9
投票

为了说明已经说过的话:

取消设置变量(注意一些

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
投票

简单的例子证明

我检查是否存在参数 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

参考:这个那个

© www.soinside.com 2019 - 2024. All rights reserved.