Bash 支持很多運算符,其中包括:
- 算數運算符
- 關係運算符
- 邏輯運算符
- 字符串運算符
- 文件測試運算符
算數運算符
算術運算符包括:
其實原生bash不支持簡單的數學運算,但是可以通過其他命令來實現,
例如 awk 和 expr命令,expr 最常用。
expr 是一款表達式計算工具,使用它能完成表達式的求值操作。
舉例說明:
#!/bin/bash
#created by yuki on 20180723
#this script is used for doing ......
a=10
b=20
result=`expr $a + $b`
echo "a + b = $result"
result=`expr $a - $b`
echo "a - b = $result"
result=`expr $a \* $b`
echo "a * b = $result"
result=`expr $b / $a`
echo " b / a = $result"
result=`expr $b % $a`
echo "b % a = $result"
運行結果:
a + b = 30
a - b = -10
a * b = 200
b / a = 2
b % a = 0
以下幾點需要注意:
1.表達式和運算符之間要有空格。
例如: 5+10 是不對的,必須寫成 5 + 10,這與我們熟悉的大多數編程語言不一樣。
2.完整的表達式要被 ` ` 包含,注意這個字符不是常用的單引號,在 Esc 鍵下邊。
3.乘號(*)前邊必須加反斜槓(\)進行轉義才能實現乘法運算。
關係運算符
關係運算符包括:
在[]中使用的比較符 | 在(()和[[]]}中使用的比較符 | 說明 | 舉例 |
---|---|---|---|
-eq | == | equal的縮寫,表相等 | [ $a -eq $b ] 返回true |
-ne | != | not equal的縮寫,表不相等 | [ $a -eq $b ] 返回true |
-gt | > | greater thanl的縮寫,表大於 | [ $a -gt $b ] 返回true |
-ge | >= | greater equal的縮寫,表大於等於 | [ $a -ge $b ] 返回true |
-lt | < | greater equal的縮寫,表小於 | [ $a -lt $b ] 返回true |
-le | <= | greater equal的縮寫,表小於等於 | [ $a -lq $b ] 返回true |
提示:
1. "<"符號意思是小於,要麼:if [[ "$a" < "$b" ]] 是錯誤的,要麼:if [ "$a" \< "$b" ] (即在單[]中需要轉義,因爲shell也用 <和>表示重定向)。
2. ">"符號意思是大於,要麼:if [[ "$a" > "$b" ]] 是錯誤的,要麼:if [ "$a" \> "$b" ] (即在單[]中需要轉義,因爲shell也用 <和>表示重定向)。
3. 關係運算符只支持數字(整數),不支持字符串,除非字符串的值是數字(整數)。
4. 條件表達式要放在方括號之間,並且要有空格,例如 [[$a==$b]] 是錯誤的,必須寫成 [[ $a == $b ]]。
舉例說明:
#!/bin/bash
#created by yuki on 20180723
#this script is used for doing ......
a=5
b=10
if [ $a -eq $b ]
then
echo "eq 關係運算結果: a等於b"
else
echo "eq 關係運算結果: a不等於b"
fi
if [ $a -ne $b ]
then
echo "ne 關係運算結果: a不等於b"
else
echo "ne 關係運算結果: a等於b"
fi
if [ $a -gt $b ]
then
echo "gt 關係運算結果: a大於b"
else
echo "gt 關係運算結果: a小於等於b"
fi
if [ $a -lt $b ]
then
echo "lt 關係運算結果:a小於b"
else
echo "lt 關係運算結果:a大於等於b"
fi
if [ $a -ge $b ]
then
echo "ge 關係運算結果:a大於等於b"
else
echo "ge 關係運算結果:a小於b"
fi
if [ $a -le $b ]
then
echo "le 關係運算結果:a小於等於b"
else
echo "le 關係運算結果:a大於b"
fi
運行結果:
eq 關係運算結果: a不等於b
ne 關係運算結果: a不等於b
gt 關係運算結果: a小於等於b
lt 關係運算結果:a小於b
ge 關係運算結果:a小於b
le 關係運算結果:a小於等於b
邏輯運算符
在[ ]中使用的比較符 | 在(()和[[]]}中使用的比較符 | 說明 | 舉例 |
---|---|---|---|
賦值 | a=10 | b=25 | |
-a | && | 與運算,兩個表達式都爲true,才返回true | [ $a -lt 20 -a $b -gt 20 ] 返回true |
-o | || | 或運算,有一個表達式都爲true,則返回true | [ $a -lt 20 -o $b -gt 100 ] 返回true |
! | ! | 非運算,表達式爲true,則返回false | [ ! false ] 返回true |
小結:邏輯操作符使用總結
[ ]中用 -a,-o, !
[[ ]]中用 &&,||, !
test 用法和 [ ]相同
舉例說明:
#!/bin/bash
#created by yuki on 20180723
#this script is used for doing ......
a=5
b=10
if [ $a != $b ]
then
echo "!= 邏輯非運算結果:a不等於b"
else
echo "!=邏輯非運算結果: a等於b"
fi
if [ $a -lt 50 -a $b -gt 8 ]
then
echo "and 邏輯與運算結果:真"
else
echo "and 邏輯與運算結果:假"
fi
if [ $a -lt 50 -o $b -gt 12 ]
then
echo "or 邏輯或運算結果:真"
else
echo "or 邏輯或運算結果:假"
fi
if [ $a -lt 3 -o $b -gt 8 ]
then
echo "or 邏輯或運算結果:真"
else
echo "or 邏輯或運算結果:假"
fi
運行結果:
!= 邏輯非運算結果:a不等於b
and 邏輯與運算結果:真
or 邏輯或運算結果:真
or 邏輯或運算結果:真
字符串運算符
字符串運算符包括:
運算符 | 說明 | 舉例 |
---|---|---|
= | 檢測兩個字符串是否相等,相等則返回true | [ $a = $b ] 返回true |
!= | 檢測兩個字符串是否相等,不相等則返回true | [ $a != $b ] 返回true |
-z | 檢測字符串長度是否爲0,爲0則返回true | [ -z $b ] 返回true |
-n | 檢測字符串長度是否爲0,不爲0則返回true | [ -n $b ] 返回true |
str | 檢測字符串是否爲null,不爲null則返回true | [ $b ] 返回true |
#經測試:
字符串比較用單等號或雙等號都可以,而且外邊的中括號最好是用雙中括號,這樣結果比較準確。
舉例說明:
[root@myhost ~]# string="abcde"
[root@myhost ~]# if [[ "$string" == abc* ]]; then echo "abc開頭"; else echo "不是"; fi
abc開頭
[root@myhost ~]# if [ "$string" == abc* ]; then echo "abc開頭"; else echo "不是"; fi
不是
[root@myhost ~]# if [ "$string" = abc* ]; then echo "abc開頭"; else echo "不是"; fi
不是
[root@myhost ~]# if [[ "$string" = abc* ]]; then echo "abc開頭"; else echo "不是"; fi
abc開頭
[root@myhost ~]# string="abcde"
[root@myhost ~]# if [[ "$string" = "abc*" ]]; then echo "不相等"; else echo "不等"; fi
不等
[root@myhost ~]# if [[ "$string" == "abc*" ]]; then echo "不相等"; else echo "不等"; fi
不等
[root@myhost ~]# if [ "$string" == "abc*" ]; then echo "不相等"; else echo "不等"; fi
不等
[root@myhost ~]# if [ "$string" = "abc*" ]; then echo "不相等"; else echo "不等"; fi
不等
舉例說明:
#!/bin/bash
#created by yuki on 20180723
#this script is used for doing ......
a="cfe"
b="efr"
if [ "$a" = "$b" ]
then
echo "字符串a和字符串b相等"
else
echo "字符串a和字符串b不相等"
fi
if [ "$a" == "$b" ]
then
echo "字符串a和字符串b相等"
else
echo "字符串a和字符串b不相等"
fi
[root@myhost ~]# a="cfe"
[root@myhost ~]# b="efr"
[root@myhost ~]# if [ "$a" =="$b" ]
> then
############## end ####################################
if [ "$a" != "$b" ]
then
echo "字符串a和字符串b不相等"
else
echo "字符串a和字符串b相等"
fi
if [ -z "$a" ]
then
echo "字符串a的長度爲0,即字符串a爲空?"
else
echo "字符串a的長度不爲0"
fi
if [ -n "$a" ]
then
echo "字符串a的長度不爲0"
else
echo "字符串a的長度爲0,即字符串a爲空?"
fi
if [ "$a" ]
then
echo "字符串a不爲空"
else
echo "字符串不爲空"
fi
運行結果:
字符串a和字符串b不相等
字符串a的長度不爲0
字符串a的長度不爲0
字符串a不爲空
文件測試運算符
文件測試運算符包括:
操作符 | 說明 | 舉例 |
---|---|---|
-b | 檢測文件是否是塊設備文件,如果是,則返回true | [ -b $file ] 返回true |
-c | 檢測文件是否是字符設備文件,如果是,則返回true | [ -c $file ] 返回true |
-d | 檢測文件是否是目錄文件,如果是,則返回true | [ -d $file ] 返回true |
-f | 檢測文件是否是普通文件(既不是目錄也不是設備文件),如果是,則返回true | [ -f $file ] 返回true |
-g | 檢測文件是否設置了SGID位,如果是,則返回true | [ -g $file ] 返回true |
-k | 檢測文件是否設置了粘着位(stucky Bit),如果是,則返回true | [ -k $file ] 返回true |
-p | 檢測文件是否具名管道,如果是,則返回true | [ -p $file ] 返回true |
-u | 檢測文件是否設置了SUID位,如果是,則返回true | [ -u $file ] 返回true |
-r | 檢測文件是否可讀,如果是,則返回true | [ -r $file ] 返回true |
-w | 檢測文件是否可寫,如果是,則返回true | [ -w $file ] 返回true |
-x | 檢測文件是否可執行,如果是,則返回true | [ -x $file ] 返回true |
-s | 檢測文件是否爲不爲空(文件大小是否不爲0),如果不爲0,則返回true | [ -s $file ] 返回true |
-e | 檢測文件(包括目錄)是否存在,如果存在,則返回true | [ -e $file ] 返回true |
-a | 檢測文件(包括目錄)是否存在,如果存在,則返回true | [ -e $file ] 返回true |
文件測試運算符用於檢測 Unix 文件的各種屬性,-a已經被棄用了。
舉例說明:
例如,變量 file 表示文件“ /etc/rc.d/rc.local”,它的大小爲220kb,所有者root用戶具有 rwx 權限。
[root@myhost ~]# ll /etc/rc.d/rc.local
-rwxr-xr-x 1 root root 220 Oct 4 2017 /etc/rc.d/rc.local
下面的代碼,將檢測該文件的各種屬性:
#!/bin/bash
#created by yuki on 20180723
#this script is used for doing ......
file="/etc/rc.d/rc.local"
if [ -e $file ]
then
echo "這個已經存在"
else
echo "這個不存在"
fi
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 [ -d $file ]
then
echo "這個是目錄"
else
echo "這個不是目錄"
fi
if [ -f $file ]
then
echo "這個是普通文件"
else
echo "這個不是普通文件"
fi
if [ -s $file ]
then
echo "此文件大小不爲0"
else
echo "此文件大小爲0,即文件內容爲空"
fi
運行結果:
這個已經存在
當前用戶可讀此文件
當前用戶可寫此文件
當前用戶可以執行此文件
這個不是目錄
這個是普通文件
此文件大小不爲0