邏輯運算子在Shell指令碼程式設計中的應用

2021-09-21 23:40:44 字數 3498 閱讀 5625

原文發表於2023年第11期《網路安全與資訊化》,**到部落格。

在linux系統運維工作中,shell指令碼程式設計是運維人員應必須掌握的一項基本技能,在大多數的shell指令碼中都需要進行條件測試操作,從而使得指令碼可以有選擇地執行任務。本文將介紹如何通過邏輯運算子來同時測試多個條件,以及如何利用邏輯運算子來連線多條命令,從而實現簡單高效的選擇判斷操作。

通過邏輯運算子可以同時測試多個條件,根據這些條件是否同時成立或者只要有其中乙個條件成立等情況,來決定採取何種操作。邏輯運算子有:

 &&:邏輯與,表示前後兩個條件都成立時整個測試結果才為真,否則結果為假。

 ||:邏輯或,表示前後兩個條件至少有乙個成立時整個測試結果即為真,否則結果為假。

 !:邏輯非,表示當指定的條件不成立時,整個測試結果為真。

邏輯運算子的基本用法非常簡單,比如判斷檔案「/etc/passwd」和「/etc/shadow」是否存在,要求兩個條件同時滿足,則可以使用下面的表示式,並通過檢視「$?」的值來獲知測試結果,值為0表示條件成立,值為非0表示條件不成立。

[root@server ~]# [ -e /etc/passwd ] && [ -e /etc/shadow ]

[root@server ~]# echo $?

0再比如要測試當前使用者對檔案「/etc/passwd」和「/etc/shadow」是否具有寫入許可權,只要滿足其中乙個條件即可,可以使用下面的表示式。

[root@server ~]# [ -w /etc/passwd ] || [ -w /etc/shadow ]

[root@server ~]# echo $?

0除了同時測試多個條件之外,邏輯運算子「&&」和「||」通常也用於間隔不同的命令操作,這也是本文要重點介紹的內容。比如表示式「command1 && command2」,在這個表示式中,如果command1的測試結果為假,那麼command2就不會再執行。因為對於邏輯與操作,只要有乙個測試條件不成立,那麼整個測試結果也就必然為假,因而此時就無需再去判斷command2是否成立。反之,如果command1的測試結果為真,則command2就必須執行。

如果使用邏輯運算子「||」來連線兩個命令,情況又是不同。比如表示式「command1 || command2」,在這個表示式中,如果command1的測試結果為真,則command2不再執行。因為對於邏輯或操作,只要有乙個測試條件成立,那麼整個測試結果就必然為真,因而此時也無需再去判斷command2是否為真。反之,如果command1的測試結果為假,則command2必須執行。

因而,對於「&&」和「||」的特點可以總結如下:

 &&,當前面的命令執行成功後才會執行後面的命令;

 ||,當前面的命令執行失敗後才會執行後面的命令。

下面是幾個具體的應用例項。

例:判斷當前的使用者是否是teacher,若不是則提示「not teacher」。

[root@localhost ~]# echo $user

root

[root@localhost ~]# [ $user = "teacher" ] || echo "not teacher"

not teacher

例:判斷當前的使用者是否是teacher,若是則提示「good morning teacher」,若不是則提示「not teacher」。

[root@localhost ~]# echo $user

root

[root@localhost ~]# [ $user = "teacher" ] && echo "good morning teacher" || echo "not teacher"

not teacher

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

[root@localhost ~]# useradd teacher

[root@localhost ~]# su - teacher

[teacher@localhost ~]$ [ $user = "teacher" ] && echo "good morning teacher" || echo "not teacher"

good morning teacher

在這三個邏輯運算子中,「&&」尤為常用。比如要檢視乙個條件表示式的測試結果,如果通過檢視預定義變數「$?」的值來進行判斷,操作繁瑣,輸出結果也不是很直觀。為了更便於檢視條件測試操作的結果,通常都是將「&&」和echo命令一起使用,當條件成立時直接輸出「yes」。

例:判斷檔案「/dev/cdrom」是否存在,如果存在,則直接輸出yes。

[root@localhost ~]# [ -e /dev/cdrom ] && echo "yes"

yes例:只要「/etc/rc.d/rc.local」或者「/etc/init.d/rc.local」中有乙個是檔案,則顯示「yes」,否則無任何輸出。

[root@localhost ~]# [ -f /etc/rc.d/rc.local ] || [ -f /etc/init.d/rc.local ] && echo "yes"

例:測試「/etc/profile」檔案是否有可執行許可權,若確實沒有可執行許可權,則提示「no x mode」的資訊。

[root@localhost ~]# [ ! -x "etc/profile" ] && echo "no x mode"

no x mode

例:若當前使用者是root且使用的shell程式是「/bin/bash」,則顯示「yes」,否則無任何輸出。

[root@localhost ~]# [ $user = "root" ] && [ $shell = "/bin/bash" ] && echo "yes"

yes下面來編寫乙個具體的指令碼,要實現的功能是刪除「/root/test」目錄中的test-1、test-2……test-10檔案,但是test-3和test-7除外。

在指令碼中用到了for迴圈和continue語句,continue語句在for迴圈中用於暫停本次操作,跳轉至迴圈語句的頂部重新測試條件,本次執行過程中continue後的命令序列將被忽略。

[root@localhost ~]# ls /root/test

test-1 test-10 test-2 test-3 test-4 test-5 test-6 test-7 test-8 test-9

[root@localhost ~]# vim del.sh

#!/bin/bash

for i in $(seq 10)

do#遇到需要保留的檔案時跳過而不刪除

[ $i -eq 3 ] || [ $i -eq 7 ] && continue 

rm -f /root/test/test-$i

done

[root@localhost ~]# chmod u+x del.sh 

[root@localhost ~]# ./del.sh 

[root@localhost ~]# ls /root/test

test-3 test-7 

因而,靈活運用 「&&」和「||」這兩個邏輯運算子,在很多時候就可以代替複雜的if語句,從而使得我們的shell指令碼更加簡捷高效。

shell邏輯運算子

以下介紹 shell 的邏輯運算子,假定變數 a 為 10,變數 b 為 20 運算子說明 舉例 邏輯的 and a lt 100 b gt 100 返回 false 邏輯的 or a lt 100 b gt 100 返回 true 邏輯運算子例項如下 bin basha 10b 20if a lt...

Shell指令碼比較運算子及邏輯運算子

1 數值 格式 test num1 opr num2 num1 opr num2 opr 取值 相等 eq 不等 ne 大於 gt 小於 lt l是字母l的小寫 小於等於 le 大於等於 ge 2 字串 格式 str1 opr str2 opr str opr取值 相等 不等 空串 z 非空串 n ...

Shell指令碼比較運算子及邏輯運算子小結

1 數值 格式 test num1 opr num2 num1 opr num2 opr 取值 相等 eq 不等 ne 大於 gt 小於 lt l是字母l的小寫 小於等於 le 大於等於 ge 2 字串 格式 str1 opr str2 opr str opr取值 相等 不等 空串 z 非空串 n ...