Test

測試構造中比較的退出狀態

  • March 7, 2019

我正在寫一些“如果那麼”的陳述,發現在我看來是一種奇怪的行為。經過調查,我意識到它歸結為我正在進行的比較的退出程式碼。我在下面的程式碼片段中說明了我的發現。

如你看到的

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

引用自:https://unix.stackexchange.com/questions/504979