2016-09-21 26 views
0

通常我只使用[[用於各種測試用例,因爲它是最先進的方式,使用起來更安全(Regex,.. )。 我知道[[[和[執行不同的代碼,但根據聯機幫助頁和各種文檔,它至少應該像「-n」一樣處理選項,但它不會。Bash非零測試用例(-n),[和[[正在做不同的事情

-n STRING字符串的長度爲非零

VAR= 

if [[ -n $VAR ]] 
then 
     echo "\$VAR is nonzero" 
else 
     echo "\$VAR is zero" 
fi 

$ VAR是零

VAR= 

if [ -n $VAR ] 
then 
     echo "\$VAR is nonzero" 
else 
     echo "\$VAR is zero" 
fi 

$ VAR是非零

這是怎麼回事甚至可能?

bash 4.1.2(1)

回答

1

我認爲你的問題與報價有關。

當您使用[ -n $VAR ]時執行不包含任何參數,其中$VAR應該是命令:

$ set -x 
$ [ -n $VAR ] 
+ '[' -n ']' 

這意味着你基本上是測試字符串是否-n非空,因爲以下兩個測試是等價的:

[ string ] # is a shorthand for 
[ -n string ] # which is always true! 

如果使用引號,那麼你會得到不同的行爲:

$ [ -n "$VAR" ] 
+ '[' -n '' ']' 

現在您正在測試變量是否爲非空,以便您獲得預期的行爲。

0

Quoting。您必須引用在[中使用的變量:

$ VAR=  
$ [ -n $VAR ] 
$ echo $? 
0 
$ [ -n "$VAR" ] 
$ echo $? 
1 
相關問題