2012-09-04 26 views
76

我目前正在編寫一個bash測試框架,在測試函數中,可以使用標準bash測試([[)以及預定義的匹配器。匹配器是'[''的包裝,並且除了返回一個返回碼,還設置了一些有意義的信息來說明預期的結果。使用未設置與設置變量爲空

實施例:

string_equals() { 
    if [[ ! $1 = $2 ]]; then 
      error_message="Expected '$1' to be '$2'." 

      return 1 
    fi 
} 

所以,當使用一個匹配器,並且它出現故障,只有一個ERROR_MESSAGE被設置。

現在,在稍後的某個時刻,我測試測試是否成功。如果成功了,我會打印綠色的期望,如果紅色失敗。

此外,也有可能是ERROR_MESSAGE集,所以我測試是否存在消息,打印出來,然後再取消它(因爲下面的測試可能不會設置error_message):

if [[ $error_message ]]; then 
    printf '%s\n' "$error_message" 

    unset -v error_message 
fi 

現在我的問題是的,如果是更好地取消設置變量,或只是將其設置爲「」,像

error_message='' 

哪一個更好?它實際上有所作爲嗎?或者,也許我應該有一個額外的標誌表明該消息設置?

+1

如果你從不比較'error_message'和其他任何東西,我會說沒關係。但是,我認爲你需要'[[$ error_message]]',否則你正在測試字符串「error_message」存在。 – chepner

+0

@chepner是的,是一個錯字。修復。 – helpermethod

回答

108

晴看不到有差別,除非你使用set -u

/home/user1> var="" 
/home/user1> echo $var 

/home/user1> set -u 
/home/user1> echo $var 

/home/user1> unset var 
/home/user1> echo $var 
-bash: var: unbound variable 

所以真的,這取決於你如何去測試變量。

我會補充說,測試我的首選方式,如果它被設置爲:

[[ -n $var ]] # True if the length of $var is non-zero 

[[ -z $var ]] # True if zero length 
+31

'var ='不是「未設置」。這只是一個沒有引號的空字符串。除'set -u'之外,bash的各種形式的參數擴展還可以區分unset和null值:'foo:bar}'在'foo'未設置時擴展爲「bar」,而'foo '爲空,而如果foo未設置或爲空,則「$ {foo:-bar}」擴展爲「bar」。 – chepner

+0

如果將'var'設置爲空字符串,'[[-n $ var]]'爲false。 – chepner

+0

@chepner:好的,這就是我的意思,我會做一個編輯。 – cdarke

10

正如人們所說的,使用未設置與數組不同以及

$ foo=(4 5 6) 

$ foo[2]= 

$ echo ${#foo[*]} 
3 

$ unset foo[2] 

$ echo ${#foo[*]} 
2