4.3.1 if條件測(cè)試語(yǔ)句

2023-05-11 14:48 更新

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ò)字樣的提示。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)