Shell 基本運運算元
Shell 和其他程式語言一樣,支援多種運運算元,包括:

算數運運算元
關係運運算元
布林運運算元
字串運運算元
檔案測試運運算元

原生 bash 不支援簡單的數學運算,但是可以透過其他命令來實現,例如 awk 和 expr,expr 最常用。
expr 是一款表示式計算工具,使用它能完成表示式的求值操作。
例如,兩個數相加 (注意使用的是反引號 ` 而不是單引號 ‘):
#!/bin/bash

val=`expr 2 + 2`
echo “ 兩數之和為 : $val”

執行例項 »
執行指令碼,輸出結果如下所示:
兩數之和為 : 4

兩點注意:

表示式和運運算元之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數程式語言不一樣。
完整的表示式要被 ` ` 包含,注意這個字元不是常用的單引號,在 Esc 鍵下邊。

算術運運算元
下表列出了常用的算術運運算元,假定變數 a 為 10,變數 b 為 20:

運運算元
說明
舉例

+
加法
`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 ] 。
例項
算術運運算元例項如下:
#!/bin/bash
# author: 菜鳥教程
# url:www.runoob.com

a=10
b=20

val=`expr $a + $b`
echo “a + b : $val”

val=`expr $a – $b`
echo “a – b : $val”

val=`expr $a * $b`
echo “a * b : $val”

val=`expr $b / $a`
echo “b / a : $val”

val=`expr $b % $a`
echo “b % a : $val”

if [ $a == $b ]
then
echo “a 等於 b”
fi
if [ $a != $b ]
then
echo “a 不等於 b”
fi

執行指令碼,輸出結果如下所示:
a + b : 30
a – b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等於 b

注意:

乘號 (*) 前邊必須加反斜槓 () 才能實現乘法運算;
if…then…fi 是條件語句,後續將會講解。
在 MAC 中 shell 的 expr 語法是:$((表示式)),此處表示式中的 “*” 不需要轉義符號 “” 。

關係運運算元
關係運運算元只支援數字,不支援字串,除非字串的值是數字。
下表列出了常用的關係運運算元,假定變數 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 。

例項
關係運運算元例項如下:
#!/bin/bash
# author: 菜鳥教程
# url:www.runoob.com

a=10
b=20

if [ $a -eq $b ]
then
echo “$a -eq $b : a 等於 b”
else
echo “$a -eq $b: a 不等於 b”
fi
if [ $a -ne $b ]
then
echo “$a -ne $b: a 不等於 b”
else
echo “$a -ne $b : a 等於 b”
fi
if [ $a -gt $b ]
then
echo “$a -gt $b: a 大於 b”
else
echo “$a -gt $b: a 不大於 b”
fi
if [ $a -lt $b ]
then
echo “$a -lt $b: a 小於 b”
else
echo “$a -lt $b: a 不小於 b”
fi
if [ $a -ge $b ]
then
echo “$a -ge $b: a 大於或等於 b”
else
echo “$a -ge $b: a 小於 b”
fi
if [ $a -le $b ]
then
echo “$a -le $b: a 小於或等於 b”
else
echo “$a -le $b: a 大於 b”
fi

執行指令碼,輸出結果如下所示:
10 -eq 20: a 不等於 b
10 -ne 20: a 不等於 b
10 -gt 20: a 不大於 b
10 -lt 20: a 小於 b
10 -ge 20: a 小於 b
10 -le 20: a 小於或等於 b

布林運運算元
下表列出了常用的布林運運算元,假定變數 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 。

例項
布林運運算元例項如下:
#!/bin/bash
# author: 菜鳥教程
# url:www.runoob.com

a=10
b=20

if [ $a != $b ]
then
echo “$a != $b : a 不等於 b”
else
echo “$a != $b: a 等於 b”
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
echo “$a -lt 100 -a $b -gt 15 : 返回 true”
else
echo “$a -lt 100 -a $b -gt 15 : 返回 false”
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
echo “$a -lt 100 -o $b -gt 100 : 返回 true”
else
echo “$a -lt 100 -o $b -gt 100 : 返回 false”
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
echo “$a -lt 100 -o $b -gt 100 : 返回 true”
else
echo “$a -lt 100 -o $b -gt 100 : 返回 false”
fi

執行指令碼,輸出結果如下所示:
10 != 20 : a 不等於 b
10 -lt 100 -a 20 -gt 15 : 返回 true
10 -lt 100 -o 20 -gt 100 : 返回 true
10 -lt 100 -o 20 -gt 100 : 返回 false

邏輯運運算元
以下介紹 Shell 的邏輯運運算元,假定變數 a 為 10,變數 b 為 20:

運運算元
說明
舉例

&&
邏輯的 AND
[[ $a -lt 100 && $b -gt 100 ]] 返回 false

||
邏輯的 OR
[[ $a -lt 100 || $b -gt 100 ]] 返回 true

例項
邏輯運運算元例項如下:
#!/bin/bash
# author: 菜鳥教程
# url:www.runoob.com

a=10
b=20

if [[ $a -lt 100 && $b -gt 100 ]]
then
echo “ 返回 true”
else
echo “ 返回 false”
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
echo “ 返回 true”
else
echo “ 返回 false”
fi

執行指令碼,輸出結果如下所示:
返回 false
返回 true

字串運運算元
下表列出了常用的字串運運算元,假定變數 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 。

例項
字串運運算元例項如下:
#!/bin/bash
# author: 菜鳥教程
# url:www.runoob.com

a=”abc”
b=”efg”

if [ $a = $b ]
then
echo “$a = $b : a 等於 b”
else
echo “$a = $b: a 不等於 b”
fi
if [ $a != $b ]
then
echo “$a != $b : a 不等於 b”
else
echo “$a != $b: a 等於 b”
fi
if [ -z $a ]
then
echo “-z $a : 字串長度為 0”
else
echo “-z $a : 字串長度不為 0”
fi
if [ -n $a ]
then
echo “-n $a : 字串長度不為 0”
else
echo “-n $a : 字串長度為 0”
fi
if [ $a ]
then
echo “$a : 字串不為空”
else
echo “$a : 字串為空”
fi

執行指令碼,輸出結果如下所示:
abc = efg: a 不等於 b
abc != efg : a 不等於 b
-z abc : 字串長度不為 0
-n abc : 字串長度不為 0
abc : 字串不為空

檔案測試運運算元
檔案測試運運算元用於檢測 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 。

例項
變數 file 表示檔案”/var/www/runoob/test.sh”,它的大小為 100 位元組,具有 rwx 許可權。下面的程式碼,將檢測該檔案的各種屬性:
#!/bin/bash
# author: 菜鳥教程
# url:www.runoob.com

file=”/wp-content/uploads/sites/3/var/www/runoob/test.sh”
if [ -r $file ]
then
echo “ 檔案可讀”
else
echo “ 檔案不可讀”
fi
if [ -w $file ]
then
echo “ 檔案可寫”
else
echo “ 檔案不可寫”
fi
if [ -x $file ]
then
echo “ 檔案可執行”
else
echo “ 檔案不可執行”
fi
if [ -f $file ]
then
echo “ 檔案為普通檔案”
else
echo “ 檔案為特殊檔案”
fi
if [ -d $file ]
then
echo “ 檔案是個目錄”
else
echo “ 檔案不是個目錄”
fi
if [ -s $file ]
then
echo “ 檔案不為空”
else
echo “ 檔案為空”
fi
if [ -e $file ]
then
echo “ 檔案存在”
else
echo “ 檔案不存在”
fi

執行指令碼,輸出結果如下所示:
檔案可讀
檔案可寫
檔案可執行
檔案為普通檔案
檔案不是個目錄
檔案不為空
檔案存在

原文連結:http://www.runoob.com/linux/linux-shell-basic-operators.html