通過前兩篇文章伟众,我們掌握了shell的一些基本寫法和變量的使用俘枫,以及基本數(shù)據(jù)類型的運算蟹地。那么挫剑,本次就將要學(xué)習(xí)shell的結(jié)構(gòu)化命令了贯莺,也就是我們其它編程語言中的條件選擇語句及循環(huán)語句风喇。
不過,在學(xué)習(xí)shell結(jié)構(gòu)化命令的時候缕探,我們又會發(fā)現(xiàn)它與其它編程的語言相比存在不小的區(qū)別魂莫。下面就開始看看吧:
條件選擇
在條件選擇語句中,主要包含以下幾種寫法:
if-then語句
if command
then
commands
fi
吃瓜群眾表示一臉懵比:if語句后面接的是命令爹耗,我們其它編程語言中耙考,這兒都是接返回布爾值(true,false)的表達(dá)式。
那么這到底是怎么回事呢潭兽?
在shell腳本的if其實是根據(jù)緊跟后面的那個命令的退出狀態(tài)碼來判斷是否執(zhí)行then后面的語句的倦始。
關(guān)于退出狀態(tài)碼,你只需要記咨截浴:正常退出(命令執(zhí)行正常)的狀態(tài)碼是0鞋邑, 非正常退出的狀態(tài)碼不是0(有不少)。
以上語句的語義為: 如果if后面的命令執(zhí)行正常(狀態(tài)碼0)账蓉,那么就執(zhí)行then后面的語句枚碗。否則不執(zhí)行。 fi代表if語句的結(jié)束铸本。
!/bin/bash
這兒由于pwd是linux內(nèi)置的命令肮雨,因此執(zhí)行后會正常退出(狀態(tài)碼0),所以會執(zhí)行then中的語句
如果此處替換為一個不存在的命令(例如: pw)箱玷,那么就會非正常退出怨规,不會執(zhí)行then中的語句
if pwd
then
echo 執(zhí)行then里面的語句
fi
if-then還可以簡寫為
if command; then
commands
fi
因此陌宿,以上代碼還可以寫成以下:
#!/bin/bash
if pwd; then
echo 執(zhí)行then里面的語句
fi
以上,如果我要判斷處理異常退出(狀態(tài)碼非0)情況波丰,該怎么辦限番?
別著急: else 來幫你。
if-then-else語句
if command
then
commands
else
commands
fi
與if-then語句相比呀舔,這回多了個else語句弥虐,else語句用來判斷if后面的命令非正常退出的情況。
#!/bin/bash
if pwd
then
echo 正常退出
else
echo 非正常退出
fi
甚至媚赖,我們還可以變形寫出更多的else:
if command1
then
commands
elif
command2
then
command3
fi
但是上面就只能根據(jù)退出狀態(tài)碼判斷霜瘪,不能寫表達(dá)式,你還讓我怎么寫惧磺? 我各個編程語言直接吊打你颖对!
不要慌,客官磨隘,請接著往下看:
test命令
test命令用于if-then或者if-then-else語句中缤底,主要用于判斷列出的條件是否成立,如果成立番捂,就會退出并返回退出狀態(tài)碼0个唧,否則返回非0。
這意味著我們可以通過test命令來寫表達(dá)式命令了设预。不過徙歼,對于已習(xí)慣其它編程語言的程序猿們(沒學(xué)過的除外),不要高興得太早鳖枕,前方有坑魄梯,至于是什么坑,待會兒就能看到宾符。
先看看test命令的基本用法吧:
直接用:
test condition
結(jié)合if-then語句用
if test condition
then
commands
fi
結(jié)合if-then-else語句用
if test condition
then
commands
else
commands
fi
條件成立就執(zhí)行then語句酿秸,否則else語句。
test命令只能判斷一下三類條件:
數(shù)值比較
字符串比較
文件比較
數(shù)值比較
比較 | 描述 |
---|---|
n1 -eq n2 | 判斷n1是否等于n2 |
n1 -ge n2 | 判斷n1是否大于或等于n2 |
n1 -gt n2 | 判斷n1是否大于n2 |
n1 -le n2 | 判斷n1是否小于或等于n2 |
n1 -lt n2 | 判斷n1是否小于n2 |
n1 -ne n2 | 判斷n1是否不等于n2 |
特別提醒: 以上表格不用你去記住魏烫,在命令行下面, 執(zhí)行man test就能看到這些了辣苏。后面的對與另外兩種比較的同理
#!/bin/bash
num1=100
num2=200
if test $num1 -eq $num2
then
echo num1等于num2
else
echo num2不等于num2
fi
好好的標(biāo)準(zhǔn)的數(shù)學(xué)比較符號不能使用,難道非得寫這種文本形式则奥?是不是覺得很別扭考润?
不著急,還有替代方案:
使用雙括號
雙括號命令允許你在比較過程中使用高級數(shù)學(xué)表達(dá)式读处。關(guān)鍵是使用雙括號糊治,咱就可以用數(shù)學(xué)比較符號啦(等于==, 大于>, 小于< 等等都能使用啦)罚舱。
使用方法:
(( expression ))
注意:括號里面兩邊都需要有空格
#!/bin/bash
num1=100
num2=200
if (( num1 > num2 ))
then
echo "num1 > num2"
else
echo "num2 <= num2"
字符串比較
<colgroup><col><col></colgroup>
| 比較 | 描述 |
| str1 = str2 | 判斷str1是否與str2相同 |
| str1 != str2 | 判斷str1是否與str2不相同 |
| str1 < str2 | 判斷str1是否比str2小(根據(jù)ASCII) |
| str1 > str2 | 判斷str1是否比str2大(根據(jù)ASCII) |
| -n str1 | 判斷str1的長度是否非0 |
| -z str1 | 判斷str1的長度是否為0 |
程序猿們井辜,要罵的就盡情釋放吧绎谦。我反正是罵了。
test命令和測試表達(dá)式使用標(biāo)準(zhǔn)的數(shù)學(xué)比較符號來表示字符串比較,而用文本代碼來表 示數(shù)值比較粥脚。這與其它語言相比都不一樣窃肠。
#!/bin/bash
var1=test
var2=Test
if test $var1 = $str2
then
echo 相等
else
echo 不相等
fi
注意,在使用大于(>)或小于(<)符號時刷允,需要轉(zhuǎn)義(>)(<)冤留,不然會把這兩種符號時別為重定向(后面文章才會講到)。
吐槽模式開啟:我要用個比較符號树灶,還要轉(zhuǎn)義纤怒,很蛋疼的設(shè)計!
不要慌天通,大招一般都在后面:
使用雙方括號
雙方括號命令提供了針對字符串比較的高級特性泊窘。它不僅解決了使用test所帶來的一系列毛病,還提供了一些test命令所沒有的高級用法像寒。雙方括號命令的格式如下:
[[ expression ]]
注意烘豹,可能有些shell不支持此種寫法。不過bash完美支持诺祸。以上寫法注意括號內(nèi)兩邊都有空格携悯。
#!/bin/bash
var1=test
var2=Test
if [[ $test < $test2 ]]
then
echo "test1 < test2"
else
echo "test1 >= test2"
fi
這下終于不用轉(zhuǎn)義了。
文件比較
對于文件的比較序臂,其實跟上面差不多蚌卤,都是用test命令。由于篇幅有限奥秆,我這兒就不多寫了。通過man test命令可以看到具體的用法咸灿。
case語句
在使用if-then-else語句中构订,如果碰到條件很多的情況,如下:
#!/bin/bash
num=3
if (( $num == 1 ))
then
echo "num=1"
elif (( $num == 2 ))
then
echo "num=2"
elif (( $num == 3 ))
then
echo "num=3"
elif (( $num == 4 ))
then
echo "num=4"
fi
如果再多點條件避矢,看起來是不是很多悼瘾?
此時,其實還有一種替代方案审胸,那就是使用case.
case variable in
pattern1 | pattern2) commands1;; pattern3) commands2;;
*) default commands;;
esac
將以上代碼替換為case:
#!/bin/bash
case $num in
1)
echo "num=1";;
2)
echo "num=2";;
3)
echo "num=3";;
4)
echo "num=4";;
*)
echo "defaul";;
esac
小結(jié)
本篇主要講了條件語句亥宿。shell中的條件語句與其他編程語言相比有不小的區(qū)別,最大的區(qū)別就在于條件語句后接的是命令砂沛,而不是布爾值烫扼, 是根據(jù)命令執(zhí)行退出的狀態(tài)碼來決定是否進(jìn)入then語句的。這點需要牢記碍庵。