2013-05-03 55 views
2

我在bash中的測試語法中犯了一個錯誤,但現在我想了解在使用-n-z進行字符串檢查時發生了什麼。 我寫了以下幾行來獲取LINENUM變量grep的行號。當沒有找到字符串(文件中只有一個,肯定)時,LINENUM變量爲空。bash中的字符串檢查與-z和-n

$ LINENUM=$(grep -w -n mystring myfile | cut -d: -f1) 
$ echo --$LINENUM-- 
---- 
$ if [ -n $LINENUM ] ; then echo "Checked -n"; fi 
Checked -n 
$ if [ -z $LINENUM ] ; then echo "Checked -z"; fi 
Checked -z 

然後我意識到我忘了雙引號,然後將下面的檢查給我:

$ if [ -n "$LINENUM" ] ; then echo "Checked -n"; fi 
$ if [ -z "$LINENUM" ] ; then echo "Checked -z"; fi 
Checked -z 

所以,在前測試中,在那裏我忘了雙引號,對什麼做的,如果測試檢查,真的,因爲我得到了兩個來自-n-z的正面檢查?

+0

如果使用雙括號:'[[...]]',則不需要引用變量 - 即使它具有嵌入空格。 – cdarke 2013-05-03 09:57:40

回答

2

不帶引號,你的測試語句(帶有運營商,擁有-X這裏表示),減少對

if [ -X ]; then echo "Checked -X"; fi 

根據POSIX標準的test的一個參數形式(你現在在這裏)如果參數非空,則爲true。由於字符串-X非空(它不再是運算符),它的計算結果爲true。

用引號,你

if [ -X "" ]; then echo "Checked -X"; fi 

由於引號會強制一個空的第二個參數,你有test 2參數的形式,和-X(是否-n-z)被正確識別作爲主操作符作用於第二個null參數。

相關問題