在Linux系統(tǒng)運維工作中,Shell腳本編程是運維人員必須掌握的一項基本技能。在大多數的Shell腳本中都需要進行條件測試操作,從而使得腳本可以有選擇地執(zhí)行任務。本文介紹如何通過邏輯運算符來同時測試多個條件,以及如何利用邏輯運算符來連接多條命令,從而實現簡單高效的選擇判斷操作。
通過邏輯運算符可以同時測試多個條件,根據這些條件是否同時成立或者只要有其中一個條件成立等情況,來決定采取何種操作。邏輯運算符有:
* &&:邏 輯與,表示前后兩個條件都成立時整個測試結果才為真,否則結果為假。
* ||:邏輯或,表示前后兩個條件至少有一個成立時整個測試結果即為真,否則結果為假。
* !:邏輯非,表示當指定的條件不成立時,整個測試結果為真。
邏輯運算符的基本用法非常簡單,比如判斷文件“/etc/passwd” 和“/etc/shadow”是否存在,要求兩個條件同時滿足,則可以使用下面的表達式,并通過查看“$?”的值來獲知測試結果,值為0表示條件成立,值為非0表示條件不成立。

再比如要測試當前用戶對文件“/etc/passwd”和“/etc/shadow”是否具有寫入權限,只要滿足其中一個條件即可,可以使用下面的表達式。

除了同時測試多個條件之外,邏輯運算符“&&”和“||”通常也用于間隔不同的命令操作,這也是本文要重點介紹的內容。比如表達式“command1 && command2”,在這個表達式中,如果command1的測試結果為假,那么command2就不會再執(zhí)行。因為對于邏輯與操作,只要有一個測試條件不成立,那么整個測試結果也就必然為假,因而此時就無需再去判斷command2是否成立。反之,如果command1的測試結果為真,則command2就必須執(zhí)行。
如果使用邏輯運算符“||”來連接兩個命令,情況又是不同。比如表達式“command1 || command2”,在這個表達式中,如果command1的測試結果為真,則command2不再執(zhí)行。因為對于邏輯或操作,只要有一個測試條件成立,那么整個測試結果就必然為真,因而此時也無需再去判斷command2是否為真。反之,如果command1的測試結果為假,則command2必須執(zhí)行。
因而,對于“&&”和“||”的特點可以總結如下:
* &&,當前面的命令執(zhí)行成功后才會執(zhí)行后面的命令;
* ||,當前面的命令執(zhí)行失敗后才會執(zhí)行后面的命令。
下面是幾個具體的應用實例。
例:判斷當前的用戶是否是teacher,若不是則提示“Not teacher”。

同樣是上面這個操作,我們切換到teacher用戶再來試一下。

在這三個邏輯運算符中,“&&”尤為常用。比如要查看一個條件表達式的測試結果,如果通過查看預定義變量“$?”的值來進行判斷,操作繁瑣,輸出結果也不是很直觀。為了更便于查看條件測試操作的結果,通常都是將“&&”和echo命令一起使用,當條件成立時直接輸出“yes”。
例:判斷文件“/dev/cdrom”是否存在,如果存在,則直接輸出yes。

例:只 要“/etc/rc.d/rc.local”或者“/etc/init.d/rc.local”中有一個是文件,則顯示“YES”,否則無任何輸出。

例:測 試“/etc/profile”文件是否有可執(zhí)行權限,若確實沒有可執(zhí)行權限,則提示“No x mode”的信息。

例:若當前用戶是root且使用的shell程序是“/bin/bash”,則顯示“yes”,否則無任何輸出。

下面來編寫一個具體的腳本,要實現的功能是刪除“/root/test”目錄中的test-1、test-2……test-10文件,但是test-3和test-7除外。
在腳本中用到了for循 環(huán) 和continue語 句,continue語句在for循環(huán)中用于暫停本次操作,跳轉至循環(huán)語句的頂部重新測試條件,本次執(zhí)行過程中continue后的命令序列將被忽略。

因而,靈活運用 “&&”和“||”這兩個邏輯運算符,在很多時候就可以代替復雜的if語句,從而使得我們的Shell腳本更加簡捷高效。