1. 程式人生 > >bash shell數值比較(-eq)與字符比較(==)的區別

bash shell數值比較(-eq)與字符比較(==)的區別

整數比較 ron shell 時間 導致 erro opera 10.10 在線

運維中經常編寫腳本時,如果遇到使用變量間歇取值並和整數進行比較時,大多數人第一時間會想到使用"-eq"進行比較,但事實中如果因特殊原因導致變量取值為空(null)時,bash shell會把null轉換為0進行"-eq"比較,如果遇到此種困惑,可以把整數比較方法改為使用字符串比較(==),這樣就可以很好的解決整數比較帶來的這種bug。

為什麽會有此文章,正是因為筆者在線上使用腳本運維的過程中,因此bug出現過兩次失手,也給公司帶來了帶來了一些損失,經過仔細分析程序日誌和腳本運行邏輯,加上如下測試過程,才真正找到了bug的所在以及解決辦法。以下是筆者推敲思路,供大家分析之用。



[root@lovefirewall ~]# echo $tables

[root@lovefirewall ~]# echo $switch

[root@lovefirewall ~]# [[ $tables -eq 0 ]] && switch=off || switch=on
[root@lovefirewall ~]# echo $switch
off
[root@lovefirewall ~]# unset switch
[root@lovefirewall ~]# echo $switch

[root@lovefirewall ~]# [[ $tables == ^$ ]] && switch=off || switch=on

[root@lovefirewall ~]# echo $switch
on
[root@lovefirewall ~]# unset switch
[root@lovefirewall ~]# echo $switch

[root@lovefirewall ~]# [[ $tables == [[:space:]] ]] && switch=off || switch=on
[root@lovefirewall ~]# echo $switch
on
[root@lovefirewall ~]# unset switch
[root@lovefirewall ~]# echo $switch

[root@lovefirewall ~]# [[ $tables == "" ]] && switch=off || switch=on
[root@lovefirewall ~]# echo $switch
off
[root@lovefirewall ~]# unset switch
[root@lovefirewall ~]# echo $switch

[root@lovefirewall ~]# [[ 0 == "" ]] && switch=off || switch=on
[root@lovefirewall ~]# echo $switch
on
[root@lovefirewall ~]# unset switch
[root@lovefirewall ~]# echo $tables

[root@lovefirewall ~]# echo $switch

[root@lovefirewall ~]# [[ $tables == 0 ]] && switch=off || switch=on
[root@lovefirewall ~]# echo $switch
on
[root@lovefirewall ~]#


bash shell只能做整數比較,浮點數無法使用數值比較,但好在可以使用字符比較進行彌補,字符的比較是沒有誤差的

[root@lovefirewall ~]# [[ 11.11 -eq 11.22 ]] && echo wrong || echo right
-bash: [[: 11.11: syntax error: invalid arithmetic operator (error token is ".11")
right
[root@lovefirewall ~]# [[ 11.11 == 11.22 ]] && echo wrong || echo right
right
[root@lovefirewall ~]# [[ 11.11 == 11.12 ]] && echo wrong || echo right
right
[root@lovefirewall ~]# [[ 10.10 == 10.01 ]] && echo wrong || echo right
right
[root@lovefirewall ~]#



仔細閱讀本文內容並按上述代碼親自測試一輪的朋友,相信你對bash shell弱類型又有了更進一步的認識了吧!理解了什麽是弱類型語言特性,以及bash shell數值比較與字符比較的區別。

bash shell數值比較(-eq)與字符比較(==)的區別