Shell運算符
Bash 支援很多運算符,包括算數運算符、關系運算符、布爾運算符、字元串運算符和檔案測試運算符。
9.1 算術運算符
- 也可以使用表達式$(( )) 或 $[]
運算符 | 說明 | 舉例 |
---|---|---|
+ | 加法 | |
- | 減法 | |
* | 乘法 | |
/ | 除法 | |
% | 取餘 | |
= | 指派 | a=$b 将把變量 b 的值賦給 a。 |
#!/bin/sh
a=10
b=20
val=$(($a + $b))
echo "a + b : $val"
val=$(($a - $b))
echo "a - b : $val"
val=$(($a * $b))
echo "a * b : $val"
val=$(($a / $b))
echo "a / b : $val"
val=$[$a % $b]
echo "a % b : $val"
9.2 關系運算符
關系運算符隻支援數字,不支援字元串,除非字元串的值是數字。
運算符 | 說明 | 舉例 |
---|---|---|
-eq | 檢測兩個數是否相等,相等傳回 true。 | [ $a -eq $b ] |
-ne | 檢測兩個數是否相等,不相等傳回 true。 | [ $a -ne $b ] |
-gt | 檢測左邊的數是否大于右邊的,如果是,則傳回 true。 | [ $a -gt $b ] |
-lt | 檢測左邊的數是否小于右邊的,如果是,則傳回 true。 | [ $a -lt $b ] |
-ge | 檢測左邊的數是否大等于右邊的,如果是,則傳回 true。 | [ $a -ge $b ] |
-le | 檢測左邊的數是否小于等于右邊的,如果是,則傳回 true。 | [ $a -le $b ] |
== | 用于比較兩個數字,相同則傳回 true。 | [ a == b ] |
!= | 用于比較兩個數字,不相同則傳回 true。 | [ a != b ] |
注意:條件表達式要放在方括号之間,并且要有空格,例如 [expression] 是錯誤的,必須寫成 [ expression ]。
來看一個關系運算符的例子:
#!/bin/sh
a=10
b=20
if [ $a -eq $b ]
then
echo "a is equal to b"
else
echo "a is not equal to b"
fi
if [ $a -ne $b ]
then
echo "a is not equal to b"
else
echo "a is equal to b"
fi
if [ $a -gt $b ]
then
echo "a is greater than b"
else
echo "a is not greater than b"
fi
if [ $a -lt $b ]
then
echo "a is less than b"
else
echo "a is not less than b"
fi
if [ $a -ge $b ]
then
echo "a is greater than or equal to b"
else
echo "a is not greater than or equal to b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a is less than or equal to b"
else
echo "$a -le $b: a is not less than or equal to b"
fi
運作結果:
a is not equal to b
a is not equal to b
a is not greater than b
a is less than b
a is not greater than or equal to b
a is less than or equal to b
9.3 邏輯運算符
運算符 | 說明 | 舉例 |
---|---|---|
-eq | 檢測兩個數是否相等,相等傳回 true。 | [ $a -eq $b ] |
-ne | 檢測兩個數是否相等,不相等傳回 true。 | [ $a -ne $b ] |
-gt | 檢測左邊的數是否大于右邊的,如果是,則傳回 true。 | [ $a -gt $b ] |
-lt | 檢測左邊的數是否小于右邊的,如果是,則傳回 true。 | [ $a -lt $b ] |
-ge | 檢測左邊的數是否大等于右邊的,如果是,則傳回 true。 | [ $a -ge $b ] |
-le | 檢測左邊的數是否小于等于右邊的,如果是,則傳回 true。 | [ $a -le $b ] |
== | 用于比較兩個數字,相同則傳回 true。 | [ a == b ] |
!= | 用于比較兩個數字,不相同則傳回 true。 | [ a != b ] |
#!/bin/bash
a=10
b=20
if [ ! $a -lt 100 ]
then
echo "! $a -lt 100 : return true"
else
echo "! $a -lt 100 : return false"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a -lt 100 -a $b -gt 15 : return true"
else
echo "$a -lt 100 -a $b -gt 15 : return false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a -lt 100 -o $b -gt 100 : return true"
else
echo "$a -lt 100 -o $b -gt 100 : return false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
echo "$a -lt 100 -o $b -gt 100 : return true"
else
echo "$a -lt 100 -o $b -gt 100 : return false"
fi
運作結果:
! 10 -lt 100 : return false
10 -lt 100 -a 20 -gt 15 : return true
10 -lt 100 -o 20 -gt 100 : return true
10 -lt 5 -o 20 -gt 100 : return false
9.4 字元串運算符
運算符 | 說明 | 舉例 |
---|---|---|
= | 檢測兩個字元串是否相等,相等傳回 true。 | [ $a = $b ] |
!= | 檢測兩個字元串是否相等,不相等傳回 true。 | [ $a != $b ] |
-z | 檢測字元串長度是否為0,為0傳回 true。 | [ -z $a ] |
str | 檢測字元串是否為空,不為空傳回 true。 | [ $a ] |
看一個例子:
#!/bin/bash
a=$1
b=$2
if [ $a = $b ]
then
echo "a = b"
else
echo "a != b"
fi
if [ $a != $b ]
then
echo "a != b"
else
echo "a = b"
fi
if [ -z $a ]
then
echo "a length is zero"
else
echo "a length is not zero"
fi
if [ $b ]
then
echo "b is not empty"
else
echo "b is empty"
fi
運作結果:
abc = efg: a is not equal to b
abc != efg : a is not equal to b
-z abc : string length is not zero
abc : string is not empty
9.5 檔案測試運算符
檔案測試運算符用于檢測 linux檔案的各種屬性。
操作符 | 說明 | 舉例 |
---|---|---|
-b file | 檢測檔案是否是塊裝置檔案,如果是,則傳回 true。 | [ -b $file ] |
-c file | 檢測檔案是否是字元裝置檔案,如果是,則傳回 true。 | [ -b $file ] |
-d file | 檢測檔案是否是目錄,如果是,則傳回 true。 | [ -d $file ] |
-f file | 檢測檔案是否是普通檔案(既不是目錄,也不是裝置檔案),如果是,則傳回 true。 | [ -f $file ] |
-p file | 檢測檔案是否是有名管道,如果是,則傳回 true。 | [ -p $file ] |
-r file | 檢測檔案是否可讀,如果是,則傳回 true。 | [ -r $file ] |
-w file | 檢測檔案是否可寫,如果是,則傳回 true。 | [ -w $file ] |
-x file | 檢測檔案是否可執行,如果是,則傳回 true。 | [ -x $file ] |
-s file | 檢測檔案是否為空(檔案大小是否大于0),不為空傳回 true。 | [ -s $file ] |
-e file | 檢測檔案(包括目錄)是否存在,如果是,則傳回 true。 | [ -e $file ] |
例如,下面的代碼,将檢測該檔案的各種屬性:
#!/bin/bash
File=$1
if [ -r $File ]
then
echo "$File has read permission"
else
echo "$File not have read permission"
fi
if [ -w $File ]
then
echo "$File has write permission"
else
echo "$File not have write permission"
fi
if [ -x $File ]
then
echo "$File has execute permission"
else
echo "$File not have execute permission"
fi
if [ -f $File ]
then
echo "$File is regular file"
else
echo "$File is special file"
fi
if [ -d $File ]
then
echo "$File is directory"
else
echo "$File is not directory"
fi
if [ -s $File ]
then
echo "$File size is not zero"
else
echo "$File size is zero"
fi
if [ -e $File ]
then
echo "$File exist"
else
echo "$File not exist"
fi
運作結果:
File has read access
File has write permission
File has execute permission
File is ordinary file
This is not directory
File size is zero
File exists