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