2015-04-17 142 views
0

我在shell腳本中遇到了一些困難,請諒解test命令。shell腳本測試命令混淆

從這段代碼在這裏:

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

我希望在如果要執行的語句,因爲n_tripi_trig都設置爲false。但是它不執行的命令列表。如果我刪除!它。我不明白爲什麼。

這裏是sh -x ./script輸出:

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

回答

1

看一看這樣的:How to declare and use boolean variables in shell script?

布爾在shell腳本並不像有很多不同的殼之間的差異的超級可靠。

這就是說你的測試是不正確的!僅適用於第一個值

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

這並不是說布爾變量不可靠;這是他們不存在。 Shell腳本只有一種類型的字符串,這就是爲什麼你需要,例如,用於字符串(「=」)和整數(「-eq」)比較的單獨運算符。 – chepner

2

!操作者只是只應用於子表達式"$n_trig",而不是整個表達式。您可以使用它的測試外,作爲if命令的一部分:

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

,或者您可以使用test命令括號內:

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

此外,test "$var"只是測試變量是否不爲空,它不會將值false視爲假。如果一個變量可以包含truefalse,你應該做的:

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