您好,登錄后才能下訂單哦!
7 - Shell_條件操作測試及if語句
要使Shell腳本程序具備一定的“智能”,面臨的第一個問題就是如何區(qū)分不同的情況以確定執(zhí)行何種操作。例如,當(dāng)磁盤使用率超過95%發(fā)送警告;當(dāng)備份目錄不存在時能夠自動創(chuàng)建;當(dāng)源碼編譯程序的配置失敗則不再繼續(xù)安裝等。
Shell環(huán)境根據(jù)命令執(zhí)行后的返回狀態(tài)值($?)來判斷是否執(zhí)行成功,當(dāng)返回值為0,表示成功,值為其他時,表示失敗。
使用專門的測試工具—test命令,可以對特定條件進(jìn)行測試,并根據(jù)返回值來判斷條件是否成立(返回值0為成立)
使用test命令的兩種形式
A:test 條件表達(dá)式
B:[ 條件表達(dá)式 ]
以上兩種方法的作用完全一樣,后者為常用。但后者需要注意方括號“[”、“]”與條件表達(dá)式之間至少有一個空格。
1. 文件測試
文件測試指的是根據(jù)給的路徑,判斷對應(yīng)的是文件還是目標(biāo),或者判斷文件是否有可讀可寫、可執(zhí)行等權(quán)限。常見操作如下:
執(zhí)行條件測試操作以后,通過預(yù)定義變量“$?”可以獲得測試命令的返回狀態(tài),從而判斷該條件是否成立。
例如:一下操作判斷/media/cdrom/目錄是否存在,返回值為1成立。
若測試條件不存在,則測試返回值將不為0(通常為1),如圖所示:
2. 整數(shù)值比較
主要根據(jù)給定的兩個值,判斷第一個與第二個數(shù)的關(guān)系,如是否大于、小于、等于第二個數(shù)。常見選項(xiàng)如下:
整數(shù)值比較在Shell腳本應(yīng)用中比較多。例如:判斷已登錄用戶數(shù)量、開啟進(jìn)程數(shù)、磁盤使用率是否超標(biāo),以及軟件版本是否符合要求。實(shí)際使用時,往往會通過變量引用,命令替換等方式來獲取一個值。
例如:若要判斷當(dāng)前已登錄的用戶數(shù),當(dāng)超過五個時輸出“Too may”,可以執(zhí)行以下語句。其中,已登錄用戶數(shù)可以通過“who | wc -l”查詢,以命令替換方式進(jìn)行。
0
再例如:若要判斷當(dāng)前可用內(nèi)存(buffers/cache)大小,當(dāng)?shù)陀?048MB時輸出具體值,可以執(zhí)行以下操作。其中“free -m”命令以MB單位輸出內(nèi)存信息。
3. 字符串比較
通常用來檢查用戶輸入、系統(tǒng)環(huán)境等是否滿足條件,在提供交互式操作的Shell腳本中,也可用來判斷用戶輸入的位置是否符合要求,常見選項(xiàng)如下:
例如:判斷當(dāng)前系統(tǒng)的語言環(huán)境,當(dāng)發(fā)現(xiàn)不是“en.US”時輸出提示信息“Not en.US”:
再例如:在Shell腳本中,經(jīng)常需要用戶輸入“yes”或“no”來確認(rèn)某個任務(wù),一下操作展示了確認(rèn)交互的過程,當(dāng)然,實(shí)際使用時還會根據(jù)變量“ACK”的取值分別執(zhí)行進(jìn)一步的操作。
4. 邏輯測試
是判斷兩個或多個條件之間的依賴關(guān)系,當(dāng)系統(tǒng)任務(wù)取決于多個不同的條件時,根據(jù)這些條件是否同時成立或只要有其中一個成立等情況,需要有一個測試的過程。常用選項(xiàng)如下:
&&:邏輯與,表示“而且”,只有前后兩個條件都成立時,整個測試命令的返回值才為0。使用test命令時,“&&”可改為“-a”
||:邏輯或,表示“或者”,只有前后兩個條件中一個成立,整個測試命令的返回值才為0。使用test命令時,“||”可改為“-o”
?。哼壿嫹瘢硎尽安弧?,只有當(dāng)指定的條件不成立時,整個測試命令的返回值才為0。
“&&”、“||”通常也用于間隔不同的命令操作,其作用是相似得。
例如:若要判斷當(dāng)前Linux系統(tǒng)的內(nèi)核版本是否大于2.4,可以執(zhí)行以下操作。
使用if條件語句
在Shell腳本中,if語句是最為常用的一種流程控制方式,用來根據(jù)特定的條件測試結(jié)果,分別執(zhí)行不同的操作(如果……那么……)
1. 單分之的if語句
if語句的“分支”指的是不同測試結(jié)果所對應(yīng)的執(zhí)行語句(一條或多條)。對于單分支選擇結(jié)構(gòu),只有在“條件測試成立”時才會執(zhí)行相應(yīng)的“命令序列”,否則不執(zhí)行任何操作,單分支結(jié)構(gòu)如下:
在上述語句結(jié)構(gòu)中,條件測試操作即“[ 條件表達(dá)式 ]”語句,也可以是其他可執(zhí)行的命令句;命令序列指的是一條或多條可執(zhí)行的命令行,也包括嵌套使用的if語句或其他流程控制語句。
單分支的執(zhí)行流程:首先判斷條件測試語句的結(jié)果,返回值為0,表示條件成立,則執(zhí)行then后面的命令序列,一直遇見fi結(jié)束判斷為止,繼續(xù)執(zhí)行其他腳本代碼;返回值為其他,則忽略then后面的命令序列,直接跳至fi以后執(zhí)行其他腳本代碼。
案例:
2. 雙分支的if語句
對于雙分支結(jié)構(gòu),要求針對“條件成立”、“條件不成立”兩種情況分別執(zhí)行不同命令序列。
雙分支if語句的執(zhí)行流程:首先判斷條件測試操作的結(jié)果,如果成立,則執(zhí)行then后的命令序列1,忽略else后的命令序列2,直到遇見fi結(jié)束判斷;若不成立,則忽略then及后面的命令序列1,直接跳至else后面的命令序列2,直到遇見fi結(jié)束判斷。
案例:
3. 多分支的if語句
由于if語句可以根據(jù)測試結(jié)果的成立,不成立分別執(zhí)行操作,所以能夠嵌套使用,進(jìn)行多次判斷。例如:首先判斷某學(xué)生的得分是否幾個,若幾個則再次判斷是否高于90分等,格式如下:
案例:
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。