shell字符串和數值做比較運算須要注意的地方

1.不管是[]仍是[[]],都建議對其內變量、字符串使用雙引號包圍。
例如:
name="zhang san"
[ $name = "zhang san" ]
上面的測試語句將報錯,由於在變量替換階段,$name被替換爲zhang san,但它們沒有在引號內,因而進行單詞拆分,這就等價於執行的是[ zhang san = "zhang san" ],顯然這是錯誤的語法。因此,建議給變量和字符串都加上雙引號:[ "$name" = "zhang san" ]
2.數值比較時,建議雙方同時加0,避免變量爲空時報錯。
例如,變量a爲空,下面的表達式是錯誤的。由於它被shell解析後至關於[ -eq 7 ],而這是錯誤的語法。shell

[root@xuexi ~]# [ $a -eq 7 ]
-bash: [: -eq: unary operator expected
採起第一種建議,將$a使用引號包圍的話,仍是錯的。由於被shell解析後至關於[ "" -eq 7 ],字符串和數值沒法比較。注意這裏的報錯和上面的錯誤信息不同。
雙方同時加0,因爲此處有一方是常量數值,因此只需爲變量部分加0便可。
[root@xuexi ~]# [ "$a" = "7" ]
[root@xuexi ~]# [ $((a+0)) -le 8 ]
3.字符串比較的建議:當變量可能爲空的時候,強烈建議在變量的基礎上加上其餘輔助字符串。看過/etc/init.d下的腳本的人確定都見過這種用法。
上面的語句雖然能正確測試。其實更安全的方法是採用下面的形式:安全

[root@xuexi ~]# [ "a$a" = "a7" ] # 判斷a是否爲7
[root@xuexi ~]# [ "a$a" = "a" ] # 判斷a是否爲空
[root@xuexi ~]# [ ! -z "$a" -a "a$a" = "a7" ] # a不爲空且a=7時才爲真bash

相關文章
相關標籤/搜索