# 算術運算符
|運算符|說明|舉例|
|---|---|---|
|+|加法|`expr $a + $b` 結果為?30。|
|-|減法|`expr $a - $b` 結果為 -10。|
|*|乘法|`expr $a \* $b` 結果為 ?200。|
|/|除法|`expr $b / $a` 結果為?2。|
|%|取余|`expr $b % $a` 結果為?0。|
|=|賦值|a=$b 將把變量 b 的值賦給 a。|
|==|相等。用于比較兩個數字,相同則返回 true。|[ $a == $b ] 返回?false。|
|!=|不相等。用于比較兩個數字,不相同則返回 true。|[ $a != $b ] 返回 true。|
注意:條件表達式要放在方括號之間,并且要有空格,例如:?\[$a==$b\]?是錯誤的,必須寫成?\[ $a == $b \]。
# 賦值運算符
|表示法|描述|
|---|---|
|parameter = value|簡單賦值。給 parameter 賦值。|
|parameter += value|加。等價于 parameter = parameter + value。|
|parameter -= value|減。等價于 parameter = parameter – value。|
|parameter *= value|乘。等價于 parameter = parameter * value。|
|parameter /= value|整除。等價于 parameter = parameter / value。|
|parameter %= value|取模。等價于 parameter = parameter % value。|
|parameter++|后綴自增變量。等價于 parameter = parameter + 1 (但,要看下面的討論)。|
|parameter--|后綴自減變量。等價于 parameter = parameter - 1。|
|++parameter|前綴自增變量。等價于 parameter = parameter + 1。|
|--parameter|前綴自減變量。等價于 parameter = parameter - 1。|
# 關系運算符
關系運算符只支持數字,不支持字符串,除非字符串的值是數字。
下表列出了常用的關系運算符,假定變量 a 為 10,變量 b 為 20:
|運算符|說明|舉例|
|---|---|---|
|-eq|檢測兩個數是否相等,相等返回 true。|[ $a -eq $b ] 返回?false。|
|-ne|檢測兩個數是否不相等,不相等返回 true。|[ $a -ne $b ] 返回 true。|
|-gt|檢測左邊的數是否大于右邊的,如果是,則返回 true。|[ $a -gt $b ] 返回 false。|
|-lt|檢測左邊的數是否小于右邊的,如果是,則返回 true。|[ $a -lt $b ] 返回 true。|
|-ge|檢測左邊的數是否大于等于右邊的,如果是,則返回 true。|[ $a -ge $b ] 返回 false。|
|-le|檢測左邊的數是否小于等于右邊的,如果是,則返回 true。|[ $a -le $b ] 返回 true。|
# 位運算符
位運算符是一類以不尋常的方式操作數字的運算符。這些運算符工作在位級別的數字。它們被用在某類底層的任務中, 經常涉及到設置或讀取位標志。
表35-5: 位運算符
|運算符|描述|
|---|---|
|~|按位取反。對一個數字所有位取反。|
|<<|位左移. 把一個數字的所有位向左移動。|
|>>|位右移. 把一個數字的所有位向右移動。|
|&|位與。對兩個數字的所有位執行一個 AND 操作。|
|\||位或。對兩個數字的所有位執行一個 OR 操作。|
|^|位異或。對兩個數字的所有位執行一個異或操作。|
注意除了按位取反運算符之外,其它所有位運算符都有相對應的賦值運算符(例如,<<=)。
# 布爾運算符
下表列出了常用的布爾運算符,假定變量 a 為 10,變量 b 為 20:
|運算符|說明|舉例|
|---|---|---|
|!|非運算,表達式為 true 則返回 false,否則返回 true。|[ ! false ] 返回 true。|
|-o|或運算,有一個表達式為 true 則返回 true。|[ $a -lt 20 -o $b -gt 100 ] 返回?true。|
|-a|與運算,兩個表達式都為 true 才返回 true。|[ $a -lt 20 -a $b -gt 100 ] 返回?false。|
# 邏輯運算符
正如我們在第27章中所看到的,復合命令 (( )) 支持各種各樣的比較運算符。還有一些可以用來計算邏輯運算。 這里是比較運算符的完整列表:
|運算符|描述|
|---|---|
|<=|小于或相等|
|>=|大于或相等|
|<|小于|
|>|大于|
|==|相等|
|!=|不相等|
|&&|邏輯與|
|\|\||邏輯或|
|expr1?expr2:expr3|條件(三元)運算符。若表達式 expr1 的計算結果為非零值(算術真),則 執行表達式 expr2,否則執行表達式 expr3。|
# 字符串運算符
下表列出了常用的字符串運算符,假定變量 a 為 "abc",變量 b 為 "efg":
|運算符|說明|舉例|
|---|---|---|
|=|檢測兩個字符串是否相等,相等返回 true。|[ $a = $b ] 返回 false。|
|!=|檢測兩個字符串是否相等,不相等返回 true。|[ $a != $b ] 返回?true。|
|-z|檢測字符串長度是否為0,為0返回 true。|[ -z $a ] 返回 false。|
|-n|檢測字符串長度是否為0,不為0返回 true。|[ -n "$a" ] 返回 true。|
|str|檢測字符串是否為空,不為空返回 true。|[ $a ] 返回?true。|
# 文件測試運算符
文件測試運算符用于檢測 Unix 文件的各種屬性。
屬性檢測描述如下:
|操作符|說明|舉例|
|---|---|---|
|-b file|檢測文件是否是塊設備文件,如果是,則返回 true。|[ -b $file ] 返回 false。|
|-c file|檢測文件是否是字符設備文件,如果是,則返回 true。|[ -c $file ] 返回?false。|
|-d file|檢測文件是否是目錄,如果是,則返回 true。|[ -d $file ] 返回 false。|
|-f file|檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。|[ -f $file ] 返回?true。|
|-g file|檢測文件是否設置了 SGID 位,如果是,則返回 true。|[ -g $file ] 返回?false。|
|-k file|檢測文件是否設置了粘著位(Sticky Bit),如果是,則返回 true。|[ -k $file ] 返回?false。|
|-p file|檢測文件是否是有名管道,如果是,則返回 true。|[ -p $file ] 返回?false。|
|-u file|檢測文件是否設置了 SUID 位,如果是,則返回 true。|[ -u $file ] 返回?false。|
|-r file|檢測文件是否可讀,如果是,則返回 true。|[ -r $file ] 返回?true。|
|-w file|檢測文件是否可寫,如果是,則返回 true。|[ -w $file ] 返回?true。|
|-x file|檢測文件是否可執行,如果是,則返回 true。|[ -x $file ] 返回?true。|
|-s file|檢測文件是否為空(文件大小是否大于0),不為空返回 true。|[ -s $file ] 返回?true。|
|-e file|檢測文件(包括目錄)是否存在,如果是,則返回 true。|[ -e $file ] 返回?true。|