shell脚本测试命令混乱

时间:2015-04-17 00:17:04

标签: shell

我在shell脚本中理解test命令时遇到了一些麻烦。

从这段代码中可以看出:

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的输出:

+ n_trig=false
+ i_trig=false
+ p_trig=false
+ getopts n:i:p: opt
+ '[' '!' false -a false ']'

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

答案 1 :(得分:1)

看看这个:How to declare and use boolean variables in shell script?

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

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

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