Test
測試構造中比較的退出狀態
我正在寫一些“如果那麼”的陳述,發現在我看來是一種奇怪的行為。經過調查,我意識到它歸結為我正在進行的比較的退出程式碼。我在下面的程式碼片段中說明了我的發現。
如你看到的
rc=1 [ $rc -eq 0 ] es_num=$? [ $rc=0 ] es_str=$? echo "es_num is $es_num" echo "es_str is $es_str"
輸出
es_num is 1 es_str is 0
是否有任何文件(最好來自 POSIX 標準)討論測試構造的退出狀態
-eq
和=
測試構造中的差異?編寫條件語句時應該注意什麼?對此有哪些最佳實踐?
可移植程式碼優於 Bash 程式碼(我正在使用)。
-eq
如果整數 n1 和 n2 在代數上相等,則為真;否則為假。
=
如果字元串 s1 和 s2 相同,則為真;否則為假。
所以
-eq
比較整數和=
比較字元串(這也適用於一些有限的整數情況)。不過,您確實有語法問題,應該是:
[ "$rc" = 0 ]
並不是
[ $rc=0 ]
[ "$rc" = 0 ]
應該以 1 退出,因為rc
不等於 0
[ $rc=0 ]
實際上應該以 0 退出,因為它可能會被視為字元串,並且[
測試構造中存在的字元串將評估為 true使用 sh
[
測試有一些區別:# leading 0 $ [ 01 -eq 1 ]; echo $? 0 # adjacent whitespace $ [ ' 1' -eq 1 ]; echo $? 0 # negative 0 vs positive 0 $ [ 0 -eq -0 ]; echo $? 0
但是 bash
[[
測試有很多不同之處(包括上面提到的那些):# base 8 $ [[ 032 -eq 26 ]]; echo $? 0 # Arithmetic expressions $ [[ 1*6+32/15*2-1 -eq 9 ]]; echo $? 0 # Base 64 $ [[ 64#Hello_world -eq -5506400892957379251 ]]; echo $? 0