W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
if條件測(cè)試語(yǔ)句可以讓腳本根據(jù)實(shí)際情況自動(dòng)執(zhí)行相應(yīng)的命令。從技術(shù)角度來(lái)講,if語(yǔ)句分為單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)、多分支結(jié)構(gòu);其復(fù)雜度隨著靈活度一起逐級(jí)上升。
if條件語(yǔ)句的單分支結(jié)構(gòu)由if、then、fi關(guān)鍵詞組成,而且只在條件成立后才執(zhí)行預(yù)設(shè)的命令,相當(dāng)于口語(yǔ)的“如果……那么……”。單分支的if語(yǔ)句屬于最簡(jiǎn)單的一種條件判斷結(jié)構(gòu),語(yǔ)法格式如圖4-17所示。
圖4-17 單分支的if語(yǔ)句
下面使用單分支的if條件語(yǔ)句來(lái)判斷/media/cdrom文件是否存在,若存在就結(jié)束條件判斷和整個(gè)Shell腳本,反之則去創(chuàng)建這個(gè)目錄:
[root@linuxprobe ~]# vim mkcdrom.sh
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
由于第5章才講解用戶身份與權(quán)限,因此這里繼續(xù)用“bash 腳本名稱”的方式來(lái)執(zhí)行腳本。在正常情況下,順利執(zhí)行完腳本文件后沒有任何輸出信息,但是可以使用ls命令驗(yàn)證/media/cdrom目錄是否已經(jīng)成功創(chuàng)建:
[root@linuxprobe ~]# bash mkcdrom.sh
[root@linuxprobe ~]# ls -d /media/cdrom
/media/cdrom
if條件語(yǔ)句的雙分支結(jié)構(gòu)由if、then、else、fi關(guān)鍵詞組成,它進(jìn)行一次條件匹配判斷,如果與條件匹配,則去執(zhí)行相應(yīng)的預(yù)設(shè)命令;反之則去執(zhí)行不匹配時(shí)的預(yù)設(shè)命令,相當(dāng)于口語(yǔ)的“如果……那么……或者……那么……”。if條件語(yǔ)句的雙分支結(jié)構(gòu)也是一種很簡(jiǎn)單的判斷結(jié)構(gòu),語(yǔ)法格式如圖4-18所示。
圖4-18 雙分支的if條件語(yǔ)句
下面使用雙分支的if條件語(yǔ)句來(lái)驗(yàn)證某臺(tái)主機(jī)是否在線,然后根據(jù)返回值的結(jié)果,要么顯示主機(jī)在線信息,要么顯示主機(jī)不在線信息。這里的腳本主要使用ping命令來(lái)測(cè)試與對(duì)方主機(jī)的網(wǎng)絡(luò)聯(lián)通性,而Linux系統(tǒng)中的ping命令不像Windows一樣嘗試4次就結(jié)束,因此為了避免用戶等待時(shí)間過長(zhǎng),需要通過-c參數(shù)來(lái)規(guī)定嘗試的次數(shù),并使用-i參數(shù)定義每個(gè)數(shù)據(jù)包的發(fā)送間隔,以及使用-W參數(shù)定義等待超時(shí)時(shí)間。
[root@linuxprobe ~]# vim chkhost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 is On-line."
else
echo "Host $1 is Off-line."
fi
我們?cè)?.2.3小節(jié)中用過$?變量,作用是顯示上一次命令的執(zhí)行返回值。若前面的那條語(yǔ)句成功執(zhí)行,則$?變量會(huì)顯示數(shù)字0,反之則顯示一個(gè)非零的數(shù)字(可能為1,也可能為2,取決于系統(tǒng)版本)。因此可以使用整數(shù)比較運(yùn)算符來(lái)判斷$?變量是否為0,從而獲知那條語(yǔ)句的最終判斷情況。這里的服務(wù)器IP地址為192.168.10.10,我們來(lái)驗(yàn)證一下腳本的效果:
[root@linuxprobe ~]# bash chkhost.sh 192.168.10.10
Host 192.168.10.10 is On-line.
[root@linuxprobe ~]# bash chkhost.sh 192.168.10.20
Host 192.168.10.20 is Off-line.
if條件語(yǔ)句的多分支結(jié)構(gòu)由if、then、else、elif、fi關(guān)鍵詞組成,它進(jìn)行多次條件匹配判斷,這多次判斷中的任何一項(xiàng)在匹配成功后都會(huì)執(zhí)行相應(yīng)的預(yù)設(shè)命令,相當(dāng)于口語(yǔ)的“如果……那么……如果……那么……”。if條件語(yǔ)句的多分支結(jié)構(gòu)是工作中最常使用的一種條件判斷結(jié)構(gòu),盡管相對(duì)復(fù)雜但是更加靈活,語(yǔ)法格式如圖4-19所示。 第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
圖 4-19 多分支的if條件語(yǔ)句
下面使用多分支的if條件語(yǔ)句來(lái)判斷用戶輸入的分?jǐn)?shù)在哪個(gè)成績(jī)區(qū)間內(nèi),然后輸出如Excellent、Pass、Fail等提示信息。在Linux系統(tǒng)中,read是用來(lái)讀取用戶輸入信息的命令,能夠把接收到的用戶輸入信息賦值給后面的指定變量,-p參數(shù)用于向用戶顯示一定的提示信息。在下面的腳本示例中,只有當(dāng)用戶輸入的分?jǐn)?shù)大于等于85分且小于等于100分,才輸出Excellent字樣;若分?jǐn)?shù)不滿足該條件(即匹配不成功),則繼續(xù)判斷分?jǐn)?shù)是否大于等于70分且小于等于84分,如果是,則輸出Pass字樣;若兩次都落空(即兩次的匹配操作都失敗了),則輸出Fail字樣:
[root@linuxprobe ~]# vim chkscore.sh
#!/bin/bash
read -p "Enter your score(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
echo "$GRADE is Pass"
else
echo "$GRADE is Fail"
fi
[root@linuxprobe ~]# bash chkscore.sh
Enter your score(0-100):88
88 is Excellent
[root@linuxprobe ~]# bash chkscore.sh
Enter your score(0-100):80
80 is Pass
下面執(zhí)行該腳本。當(dāng)用戶輸入的分?jǐn)?shù)分別為30和200時(shí),其結(jié)果如下:
[root@linuxprobe ~]# bash chkscore.sh
Enter your score(0-100):30
30 is Fail
[root@linuxprobe ~]# bash chkscore.sh
Enter your score(0-100):200
200 is Fail
為什么輸入的分?jǐn)?shù)為200時(shí),依然顯示Fail呢?原因很簡(jiǎn)單—沒有成功匹配腳本中的兩個(gè)條件判斷語(yǔ)句,因此自動(dòng)執(zhí)行了最終的兜底策略??梢?,這個(gè)腳本還不是很完美,建議讀者自行完善這個(gè)腳本,使得用戶在輸入大于100或小于0的分?jǐn)?shù)時(shí),給予Error報(bào)錯(cuò)字樣的提示。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: