shell脚本测试命令混乱

shell script test command confusion

我很难理解shell脚本中的test命令。

从这段代码中:

1
2
3
4
5
6
if [ !"$n_trig" -a"$i_trig" ]
then
    usage
    echo"Required options -n and -i are not present"
    exit 1
fi

我希望在if语句中执行命令列表,因为n_tripi_trig都设置为false。但是它不执行。如果我取下!,它就可以了。我不明白为什么。

下面是sh -x ./script的输出:

1
2
3
4
5
+ n_trig=false
+ i_trig=false
+ p_trig=false
+ getopts n:i:p: opt
+ '[' '!' false -a false ']'


!运算符只应用于子表达式"$n_trig"而不是整个表达式。您可以在测试之外使用它,作为if命令的一部分:

1
if ! ["$n_trig" -a"$i_trig" ]

或者可以在test命令中使用括号:

1
if [ ! \("$n_trig" -a"$i_trig" \) ]

另外,test"$var"只是测试变量是否不为空,它不会将值false视为假。如果变量可以包含truefalse,则应执行以下操作:

1
if ! ["$n_trig" != true -a"$i_trig" != true ]

看看这个:如何在shell脚本中声明和使用布尔变量?

shell脚本中的布尔值不是超级可靠的,因为不同shell之间存在很多差异。

那就是说你的测试是不正确的,因为!仅适用于第一个值

1
2
3
4
5
6
7
#!/bin/bash
if [ true !="$n_trig" ]  && [  true != "$i_trig" ]
then
    usage
    echo"Required options -n and -i are not present"
    exit 1
fi