???????上一節(jié)的內(nèi)容都是從上到下執(zhí)行的順序語(yǔ)句,本節(jié)介紹shell中的分支語(yǔ)句,滿足一些邏輯判斷的使用。shell中分支語(yǔ)句主要是兩種:一種是if語(yǔ)句,另一種是case語(yǔ)句。
1. if語(yǔ)句
?1.1 簡(jiǎn)單的if語(yǔ)句
if后面的指令,首先會(huì)被執(zhí)行,然后根據(jù)指令的返回狀態(tài)碼進(jìn)入對(duì)應(yīng)的分支。如果狀態(tài)碼為0,也就是指令執(zhí)行成功,就進(jìn)去then的部分;非0則進(jìn)入其他分支。舉例,建立腳本如下:
#!/bin/bash? ??
if date;then
? ? echo "date return $?"
fi
運(yùn)行結(jié)果如下:
2019年 12月 07日 星期六 23:00:25 CST
date return 0
再舉一個(gè)返回碼非零的例子,建立腳本test10.sh如下:
#/bin/bash
if abcdefg;then
? ? echo "success->abcdefg return $?"
else
? ? echo "failed->abcdefg return $?"
fi
運(yùn)行結(jié)果如下:
./test10.sh: 行 2: abcdefg: 未找到命令
failed->abcdefg return 127
1.2 條件判斷
上面的返回值是通過(guò)指令的狀態(tài)碼來(lái)選擇分支,還有一種用的比較多的就是條件判斷。
1.2.1 數(shù)學(xué)相關(guān)的判斷
數(shù)學(xué)比較指的是對(duì)兩個(gè)數(shù)字的大小進(jìn)行判斷,其中-eq判斷是否相等(equal),-ge判斷大于等于(getter equal),-gt判斷大于(getter),-le判斷小于等于(lower equal),-lt判斷小于(lower),-ne判斷不等于(not equal)。
舉個(gè)例子:
#/bin/bash
var1=34
var2=35
if [ $var1 -eq $var2 ];then
? ? echo "$var1 and $var2 is equal"
else
? ? echo "not equal"
fi
輸出結(jié)果:
not equal
注意:這些比較只能用在整數(shù)里面。
注意:有時(shí)候我們想在if判斷中使用大于小于號(hào)這種符號(hào)進(jìn)行判斷,那么可以使用雙小括號(hào)的形式。舉例如下:
#/bin/bash
var=3
if (( $var ** 2 >= 9 ));then
? ? (( var2 = $var ** 2 ))
? ? echo "var2 = $var2"
fi
運(yùn)行結(jié)果:
var2 = 9
1.2.2 字符串相關(guān)的判斷
字符串比較包括?
(1) 字符串是否相等 :? str1 = str2
? (2)? ? 字符串是否不等: str1 != str2
? (3)? ?字符串大小,也就是字典順序,越靠后越大:str1 > str2或者str1 < str2,注意:這里的符號(hào)要轉(zhuǎn)義,否則變成了重定向了。
? (4) 字符串長(zhǎng)度是否為0 :-z str
? ?(5)? 字符串長(zhǎng)度是否非0: -n str
a)比較相等的舉例:
#/bin/bash
name=wulinwaizhuan
name2=$name
if [ $name = $name2 ];then
? ? echo "$name and $name2 is equal"
else
? ? echo "$name and $name2 is not equal"
fi
運(yùn)行結(jié)果:
wulinwaizhuan and wulinwaizhuan is equal
b)比較字典序
#/bin/bash
var1="wulinwaizhuan"
var2="Wulinwaizhuan"
if [ $var1 \< $var2 ];then
? ? echo "$var1 is less than $var2"
else
? ? echo "$var2 is less than $var1"
fi
運(yùn)行結(jié)果:
Wulinwaizhuan is less than wulinwaizhuan
這說(shuō)明大寫(xiě)字母排在字典的后面(類(lèi)似于ascii的大小)。
注意:sort 命令會(huì)把小寫(xiě)字母放在前面。
c)字符串是否為空
#/bin/bash
var1="wulinwaizhuan"
var2=""
if [ -n $var1 ];then
? ? echo "$var1 is not empty"
fi
if [ -z $var2 ];then
? ? echo 'var is empty'
fi
運(yùn)行結(jié)果:
wulinwaizhuan is not empty
var is empty
注意:有時(shí)候想在字符串比較的時(shí)候使用正則表達(dá)式,可以使用雙方括號(hào),舉例如下:
#/bin/bash
name=wulin345
if [[ $name == wulin[1-5]* ]];then
? ? echo "OK"
fi
運(yùn)行如下:
OK
1.2.3 文件相關(guān)的判斷
(1) -f file 判斷file是否存在并且是一個(gè)文件
(2) -d file 判斷file是否存在并且是一個(gè)文件夾
(3) -e file 判斷file是否存在
(4)-s file判斷file是否存在并且非空
(5) -r file 判斷file是否存在并且可讀
(6) -w file 判斷file是否存在并且可寫(xiě)
(7) -x file判斷是否存在并且可執(zhí)行
(8) -O file判斷file是否存在并且屬于當(dāng)前用戶所有
(9) -G file 判斷file是否存在并且默認(rèn)組與當(dāng)前用戶相同
(10) file1 -nt file2 判斷file1是否比f(wàn)ile2新
(11)file2 -ot file2 判斷file1是否比f(wàn)ile2舊
舉例如下:
1)判斷文件tmp.txt是否存在
#/bin/bash
file=tmp.txt
if [ -e $file ];then
? ? echo "file $file is exist"
fi
運(yùn)行如下:
file tmp.txt is exist8.
2 )判斷目錄/bin是否存在
#/bin/bash
directory=/bin
if [ -d $directory ];then
? ? echo "$directory exists"
else
? ? echo "$directory not exists"
fi
運(yùn)行結(jié)果如下:
/bin exists
1.2.4 多個(gè)條件組合
條件判斷可以用兩種組合,一個(gè)是邏輯與(&&),另一個(gè)是邏輯或(||)
舉例如下:
#/bin/bash
if [ -d /home ] && [ -e /bin ];then
? ? echo "home and bin directory exist"
fi
if [ 3 -gt 2 ] || [ 3 -lt 2 ];then
? ? echo "OK"
fi
運(yùn)行如下:
home and bin directory exist
OK
2. case語(yǔ)句
if語(yǔ)句經(jīng)常用在分支不是很多的場(chǎng)景下,當(dāng)分支較多時(shí)可以考慮使用case語(yǔ)句。
#/bin/bash
fruit=apple
case $fruit in
apple|banaba)
? ? echo "fruit is $fruit"
? ? echo "case 1";;
waterwalemon)
? ? echo "case 2";;
orange)
? ? echo "case 3";;
*)
? ? echo "case default"
esac
運(yùn)行如下:
fruit is apple
case 1deng
注意:可以用豎線把多個(gè)選項(xiàng)并在一起;
可以用*號(hào)匹配最后的其余情況;
每個(gè)case的結(jié)尾要用兩個(gè);;表示結(jié)束,當(dāng)然最后一個(gè)可寫(xiě)可不寫(xiě)。
3 總結(jié)與展望
3.1總結(jié)
(1)如何寫(xiě)簡(jiǎn)單的if語(yǔ)句;
(2)判斷條件中怎么寫(xiě)數(shù)學(xué)相關(guān)的比較,比如大于小于等;
? (3)? 判斷條件中怎么寫(xiě)字符串相關(guān)的比較,比如兩個(gè)字符串是否相等,字符串是否為空等;
? (4)? 文件相關(guān)的判斷,比如文件是否存在
? (5)? 多個(gè)條件組合,比如條件與和條件或
(6)case語(yǔ)句的注意點(diǎn)
3.2 展望
下次更新將學(xué)習(xí)使用shell中的循環(huán)語(yǔ)句怎么寫(xiě)。