在Linux系統(tǒng)運(yùn)維工作中,Shell腳本編程是運(yùn)維人員必須掌握的一項基本技能。在大多數(shù)的Shell腳本中都需要進(jìn)行條件測試操作,從而使得腳本可以有選擇地執(zhí)行任務(wù)。本文介紹如何通過邏輯運(yùn)算符來同時測試多個條件,以及如何利用邏輯運(yùn)算符來連接多條命令,從而實(shí)現(xiàn)簡單高效的選擇判斷操作。
通過邏輯運(yùn)算符可以同時測試多個條件,根據(jù)這些條件是否同時成立或者只要有其中一個條件成立等情況,來決定采取何種操作。邏輯運(yùn)算符有:
* &&:邏 輯與,表示前后兩個條件都成立時整個測試結(jié)果才為真,否則結(jié)果為假。
* ||:邏輯或,表示前后兩個條件至少有一個成立時整個測試結(jié)果即為真,否則結(jié)果為假。
* !:邏輯非,表示當(dāng)指定的條件不成立時,整個測試結(jié)果為真。
邏輯運(yùn)算符的基本用法非常簡單,比如判斷文件“/etc/passwd” 和“/etc/shadow”是否存在,要求兩個條件同時滿足,則可以使用下面的表達(dá)式,并通過查看“$?”的值來獲知測試結(jié)果,值為0表示條件成立,值為非0表示條件不成立。
再比如要測試當(dāng)前用戶對文件“/etc/passwd”和“/etc/shadow”是否具有寫入權(quán)限,只要滿足其中一個條件即可,可以使用下面的表達(dá)式。
除了同時測試多個條件之外,邏輯運(yùn)算符“&&”和“||”通常也用于間隔不同的命令操作,這也是本文要重點(diǎn)介紹的內(nèi)容。比如表達(dá)式“command1 && command2”,在這個表達(dá)式中,如果command1的測試結(jié)果為假,那么command2就不會再執(zhí)行。因?yàn)閷τ谶壿嬇c操作,只要有一個測試條件不成立,那么整個測試結(jié)果也就必然為假,因而此時就無需再去判斷command2是否成立。反之,如果command1的測試結(jié)果為真,則command2就必須執(zhí)行。
如果使用邏輯運(yùn)算符“||”來連接兩個命令,情況又是不同。比如表達(dá)式“command1 || command2”,在這個表達(dá)式中,如果command1的測試結(jié)果為真,則command2不再執(zhí)行。因?yàn)閷τ谶壿嫽虿僮?,只要有一個測試條件成立,那么整個測試結(jié)果就必然為真,因而此時也無需再去判斷command2是否為真。反之,如果command1的測試結(jié)果為假,則command2必須執(zhí)行。
因而,對于“&&”和“||”的特點(diǎn)可以總結(jié)如下:
* &&,當(dāng)前面的命令執(zhí)行成功后才會執(zhí)行后面的命令;
* ||,當(dāng)前面的命令執(zhí)行失敗后才會執(zhí)行后面的命令。
下面是幾個具體的應(yīng)用實(shí)例。
例:判斷當(dāng)前的用戶是否是teacher,若不是則提示“Not teacher”。
同樣是上面這個操作,我們切換到teacher用戶再來試一下。
在這三個邏輯運(yùn)算符中,“&&”尤為常用。比如要查看一個條件表達(dá)式的測試結(jié)果,如果通過查看預(yù)定義變量“$?”的值來進(jìn)行判斷,操作繁瑣,輸出結(jié)果也不是很直觀。為了更便于查看條件測試操作的結(jié)果,通常都是將“&&”和echo命令一起使用,當(dāng)條件成立時直接輸出“yes”。
例:判斷文件“/dev/cdrom”是否存在,如果存在,則直接輸出yes。
例:只 要“/etc/rc.d/rc.local”或者“/etc/init.d/rc.local”中有一個是文件,則顯示“YES”,否則無任何輸出。
例:測 試“/etc/profile”文件是否有可執(zhí)行權(quán)限,若確實(shí)沒有可執(zhí)行權(quán)限,則提示“No x mode”的信息。
例:若當(dāng)前用戶是root且使用的shell程序是“/bin/bash”,則顯示“yes”,否則無任何輸出。
下面來編寫一個具體的腳本,要實(shí)現(xiàn)的功能是刪除“/root/test”目錄中的test-1、test-2……test-10文件,但是test-3和test-7除外。
在腳本中用到了for循 環(huán) 和continue語 句,continue語句在for循環(huán)中用于暫停本次操作,跳轉(zhuǎn)至循環(huán)語句的頂部重新測試條件,本次執(zhí)行過程中continue后的命令序列將被忽略。
因而,靈活運(yùn)用 “&&”和“||”這兩個邏輯運(yùn)算符,在很多時候就可以代替復(fù)雜的if語句,從而使得我們的Shell腳本更加簡捷高效。