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