if (()) [[]] [] 條件表達式比較示例

a、b的ASCII碼是 097、098
ASCII碼 參考 http://www.51hei.com/mcu/4342.html

1. if (())

a=3; b=2 時,
if (( a > b )); then echo $a; fi  輸出:3
if (( a < b )); then echo $a; fi  輸出:無結果

a=2; b=3 時,
if (( a > b )); then echo $a; fi  輸出:無結果
if (( a < b )); then echo $a; fi  輸出:2

if (()) 內比較的是變量,即使不帶 $,並不是ASCII碼比較。也可以用於比較數值(如 2、3的比較),但不能用於比較未定義的變量

注意,這裏不能寫成 (),爲無效表達式,會報語法錯誤。
使用雙圓括號,且可以不帶 $,前後和運算符之間均無空格要求,(( $i > $j )) 等效於 (( $i>$j ))、(($i>$j))、(( i > j ))、(( i>j ))和((i>j))

2. if [[]]

a=3; b=2 時,
if [[ a > b ]]; then echo $a; fi  輸出:無結果
if [[ a < b ]]; then echo $a; fi  輸出:3

a=2; b=3 時,
if [[ a > b ]]; then echo $a; fi  輸出:無結果
if [[ a < b ]]; then echo $a; fi  輸出:2

if [[]] 要求括號裏的表達式前後必須有一個空格,格式如 if [[ xxx ]]。
當 if [[]] 用於字符串常量或變量比較時,表達式本身的運算符,如 <、>、==、!= ,其前後可以不加空格;
但當 if [[]] 用於數值比較時,表達式本身的運算符前後必須加空格,否則會得到相反的結果。
因此,一般的寫法都是運算符前後加上空格。

注意:
不帶 $ 時,比較的是字符串常量,即ASCII碼比較,如果要進行變量值的比較,必須帶上 $。也可以用於比較數值(如 2、3的比較)。
這裏不能寫成 [],當使用 < 或 > 運算符時爲無效表達式,結果爲不確定值,如:
a=2; b=3 時,
if [ $a < $b ]; then echo $a; fi  輸出:2
if [ $a > $b ]; then echo $a; fi  輸出:2
if [ a < b ]; then echo $a; fi  輸出:2
if [ a > b ]; then echo $a; fi  輸出:2
可以看到輸出均爲2。這裏,無論對a、b 賦什麼值,帶不帶 $,if 判斷結果都爲True,所以一定會執行 echo $a。比較數值(如 2、3的比較)也是無效的。

3. if []

上面的 if [] 判斷之所以無效,是因爲 [] 裏面的 > 和 < 被當作重定向符使用了,需要進行轉義:
a=2; b=3 時,
if [ $a \< $b ]; then echo $a; fi  輸出:2
if [ $a \> $b ]; then echo $a; fi  輸出:無結果
if [ a \< b ]; then echo $a; fi  輸出:2
if [ a \> b ]; then echo $a; fi  輸出:無結果
if [ 2 \< 3 ]; then echo $a; fi  輸出:2
if [ 2 \> 3 ]; then echo $a; fi  輸出:無結果

if [] 要求括號裏的表達式前後必須有一個空格,格式如 if [[ xxx ]],至於表達式本身的運算符無該要求。跟 if [[]] 一樣。

注意:
當變量被賦值爲數字時,和數值比較一樣,可以使用如 -lt、-gt運算符替代 \< 和 \>;
當變量被賦值爲字符串時,則跟字符串比較一樣,只能使用 \< 和 \>。
這裏 a、b 不帶 $ 時作爲字符串常量用於比較,字符串的比較可以簡單參考26個字母表,越往後越大多個字符時,從左右往右逐位比較。

例如:
baa \< bc    結果:True
baa \< bab    結果:True
azzz \< baaa    結果:True
可以看出,最典型的,只要第一位“小”,整個字符串就“小”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章