Shell 基本運(yùn)算符
Shell 支持的運(yùn)算符包括
算數(shù)運(yùn)算符
關(guān)系運(yùn)算符
布爾運(yùn)算符
字符串運(yùn)算符
文件測試運(yùn)算符
算數(shù)運(yùn)算
原生bash不支持簡單的算數(shù)運(yùn)算肚医,但是可以通過其他命令來實(shí)現(xiàn),例如awk
和expr
择克,常用的是expr
。
-
expr
是一款表達(dá)式計(jì)算工具砍聊,使用它能完成表達(dá)式的求值操作唧龄。語法為:`expr 表達(dá)式`
例如:`expr a + b`
局冰;在mac中expr
的語法是:$(expr 表達(dá)式)
例如:$(expr a + b)
吊洼。 - 使用
[]
執(zhí)行算術(shù)训貌。比expr
更簡單的可以使用[]
執(zhí)行算數(shù)運(yùn)算,使用expr
做運(yùn)算時(shí)乘法運(yùn)算*
必須加轉(zhuǎn)義符\
冒窍,才能實(shí)現(xiàn)乘法運(yùn)算递沪;使用[]
則不需要轉(zhuǎn)義。
#!/bin/bash
# 表達(dá)式和運(yùn)算符之間要有空格综液,a+b寫成:a + b
# 完整的表達(dá)式被 ` ` 包含, ` 反引號(hào)
var1=`expr 2 + 2` # 計(jì)算結(jié)果是 4
# 乘號(hào) * 前面必須加反斜杠 \ 才能實(shí)現(xiàn)乘法運(yùn)算款慨,其他的運(yùn)算不需要
var2=`expr 2 \* 2` # 計(jì)算結(jié)果是 4
# 在Mac中shell的expr語法是:$(expr 表達(dá)式)
var3=$(expr 2 + 2) # 計(jì)算結(jié)果是 4
var4=$(expr 2 \* 2) # 計(jì)算結(jié)果是 4
# 使用 [] 進(jìn)行算數(shù)運(yùn)算,乘法運(yùn)算符 * 不需要轉(zhuǎn)義
var5=$[2 + 2] # 計(jì)算結(jié)果是 4
var6=$[2 * 2] # 計(jì)算結(jié)果是 4
常用算數(shù)運(yùn)算符有+谬莹、-檩奠、*约素、/、%(取余)笆凌、=(賦值)
,條件表達(dá)式運(yùn)算符有==(相等士葫。比較兩個(gè)數(shù)字是否相同)乞而、!=(不相等,比較兩個(gè)數(shù)字是否不同)
慢显,注意:條件表達(dá)式要放在方括號(hào)([]
)內(nèi)爪模,并且要有空格,例如:比較變量a和b是否相等[ $a == $b ]
荚藻。
關(guān)系運(yùn)算符
關(guān)系運(yùn)算符只支持?jǐn)?shù)字屋灌,不支持字符串,除非字符串的值是數(shù)字应狱。
下表列出了常用的關(guān)系運(yùn)算符共郭,假定變量 a=10,b=20:
運(yùn)算符 | 說明 | 舉例 |
---|---|---|
-eq |
檢測兩個(gè)數(shù)是否相等疾呻,相等返回true |
[ $a -eq $b ] 返回false |
-ne |
檢測兩個(gè)數(shù)是否不相等除嘹,不相等返回true |
[ $a -ne $b ] 返回true |
-gt |
檢測左邊的數(shù)是否大于右邊的,如果是岸蜗,則返回true |
[ $a -gt $b ] 返回false |
-lt |
檢測左邊的數(shù)是否小于右邊的尉咕,如果是,則返回true |
[ $a -lt $b ] 返回true |
-ge |
檢測左邊的數(shù)是否大于等于右邊的璃岳,如果是年缎,則返回true |
[ $a -ge $b ] 返回false |
-le |
檢測左邊的數(shù)是否小于等于右邊的,如果是铃慷,則返回true |
[ $a -le $b ] 返回true |
布爾運(yùn)算符
下表列出了常用的布爾運(yùn)算符单芜,假定a=10,b=20:
運(yùn)算符 | 說明 | 舉例 |
---|---|---|
! |
非運(yùn)算枚冗,表達(dá)式為true則返回false缓溅,否則返回true |
[ !false ] 返回true |
-o |
或運(yùn)算,有一個(gè)表達(dá)式為true則返回true |
[ $a -lt 20 -o $b -gt 100 ] 返回true |
-a |
與運(yùn)算赁温,兩個(gè)表達(dá)式都為true才返回true |
[ $a -lt 20 -a $b -gt 100 ] 返回false |
邏輯運(yùn)算符
Shell的邏輯運(yùn)算符如下坛怪,假定a=10,b=20:
運(yùn)算符 | 說明 | 舉例 |
---|---|---|
&& |
邏輯的AND |
[[ $a -lt 100 && $b -gt 100 ]] 返回false |
|| |
邏輯的OR |
[[ $a -lt 100 || $b -gt 100 ]] 返回true |
字符串運(yùn)算符
Shell的字符串運(yùn)算度如下股囊,假定a="abc"袜匿,b="efg"。
運(yùn)算符 | 說明 | 舉例 |
---|---|---|
= |
檢測兩個(gè)字符串是否相等稚疹,相等返回true |
[ $a = $b ] 返回false |
!= |
檢測兩個(gè)字符串是否相等居灯,不相等返回true |
[ $a != $b ] 返回true |
-z |
檢測字符串長度是否為0祭务,為0返回true |
[ -z $a ] 返回false |
-n |
檢測字符串長度是否為0,不為0返回true |
[ -n $a ] 返回true |
str |
檢測字符串是否為空怪嫌,不為空返回true |
[ $a ] 返回true |
> |
檢測左邊是否比右邊大义锥,如果是,返回true |
[ $a > $b ] 返回false |
< |
檢測左邊是否比右邊小岩灭,如果是拌倍,返回true |
[ $a < $b ] 返回true |
文件測試運(yùn)算符
文件測試運(yùn)算符用于檢測Uinx文件的各種屬性。
操作符 | 說明 | 舉例 |
---|---|---|
-b file |
檢測file是否是塊設(shè)備文件噪径,如果是柱恤,則返回true |
[ -b $file ] 返回false |
-c file |
檢測file是否是字符設(shè)備文件,如果是找爱,則返回true |
[ -c $file ] 返回false |
-d file |
檢測file是否存在并是目錄梗顺,如果是,則返回true |
[ -d $file ] 返回false |
-f file |
檢測file是否存在并是普通文件(既不是目錄车摄,也不是設(shè)備文件)寺谤,如果是,則返回true |
[ -f $file ] 返回true |
-g file |
檢測file是否設(shè)置了SGID位练般,如果是矗漾,則返回true |
[ -g $file ] 返回false |
-k file |
檢測file是否設(shè)置了粘著位(Sticky Bit),如果是薄料,則返回true |
[ -k $file ] 返回false |
-p file |
檢測file是否是有名管道敞贡,如果是,則返回true |
[ -p $file ] 返回false |
-u file |
檢測file是否設(shè)置了SUID位摄职,如果是誊役,則返回true |
[ -u $file ] 返回false |
-r file |
檢測file是否存在并可讀,如果是谷市,則返回true |
[ -r $file ] 返回true |
-w file |
檢測file是否可寫蛔垢,如果是,則返回true |
[ -w $file ] 返回true |
-x file |
檢測file是否可執(zhí)行迫悠,如果是鹏漆,則返回true |
[ -x $file ] 返回true |
-s file |
檢測file是否存在并非空(文件大小是否大于0),不為空返回true |
[ -s $file ] 返回true |
-e file |
檢測file(包括目錄)是否存在创泄,如果是艺玲,則返回true |
[ -e $file ] 返回true |
-O file |
檢查file是否存在并屬當(dāng)前用戶所有 |
[ -O $file ] 返回true |
-G file |
檢查file是否存在并且默認(rèn)組與當(dāng)前用戶相同 |
[ -G $file ] 返回true |
file1 -nt file2 |
檢查file1是否比file2新 |
[ $file1 -nt $file2 ] 返回true |
file1 -ot file2 |
檢查file1是否比file2舊 |
[ $file1 -ot $file2 ] 返回false |