Linux中shell運算符詳解

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