在簡單的shell腳本程式中,各條語句将按先後順序依次執行,進而實作批處理的自動化過程。然而,單一的順序結構使得腳本不夠智能,難以處理更加靈活的系統任務。通過正确的使用if語句,使得shell腳本具有一定的判斷能力,以根據不同的條件來完成不同的任務管理。
條件測試操作
要使shell腳本具有一定的智能,就必須使其區分在不同的條件下執行哪種操作。例如,當磁盤使用率超過95%時發送告警消息等
可使用專門的測試工具test指令,對特定的條件進行測試,并根據傳回值($?)來判斷條件是否成立,傳回值為0表示條件成立
使用test指令的格式如下:
格式一:test 條件表達式
格式二:[ 條件表達式 ]
通常情況下,使用格式二更符合程式設計習慣,但是方括号與條件表達式至少需要一個空格進行分隔
1. 檔案測試
檔案測試指的是根據指定的路徑名稱,判斷對應的是檔案還是目錄,是否可讀、可寫、可執行。常見的操作選項如下:
-d:測試是否為目錄(Directory)
-f:測試是否為檔案(File)
-e:測試目錄或檔案是否存在(Exist)
-r:測試目前使用者是否有權限讀取(Read)
-w:測試目前使用者是否有權限寫入(Write)
-x:測試目前使用者是否有權限執行(Excute)
2. 整數值比較
整數值比較指的是根據指定的兩個整數值,判斷第一個數和第二個數的關系,常用操作選項如下:
-eq:第一個數等于第二個數
-ne:第一個數不等于第二個數
-gt:第一個數大于第二個數
-lt:第一個數小于第二個數
-ge:第一個數大于或等于第二個數
-le:第一個數小于或等于第二個數
3. 字元串比較
字元串比較通常檢測使用者輸入、系統環境是否滿足條件,常用操作選項如下:
=:第一個字元串與第二個字元串相同
!=:第一個字元串與第二個字元串不相同
-z:檢測字元串是否為空,對于未定義或賦予空值的變量将視為空串
4. 邏輯測試
邏輯測試指的是判斷兩個或多個條件之間的依賴關系,常用的邏輯測試操作如下:
&&:邏輯與,隻有目前後兩個條件都成立時,整個測試指令的傳回值才為0。使用test指令時,&&可改為-a
||:邏輯或,隻要前後條件中有一個成立,整個測試指令的傳回值即為0。使用test指令時,||可改為-o
!:邏輯否,隻有當指定的條件不成立時,整個測試指令的傳回值才為0
if語句的結構
在shell腳本中,if語句是最常用的一種流程控制方式,用來根據指定的條件測試結構,分别執行不同的操作(如果……那麼……)
1. 單分支的if語句
案例1:判斷/media/cdrom這個目錄是否存在,若不存在則建立此目錄
1
2
3
4
5
6
7
<code>[root@localhost ~]</code><code># vim dir.sh</code>
<code>#!/bin/bash</code>
<code>DIR=</code><code>"/media/cdrom/"</code>
<code>if</code> <code>[ ! -d $DIR ]</code>
<code>then</code>
<code> </code><code>mkdir</code> <code>-p $DIR</code>
<code>fi</code>
案例2:判斷目前使用者是否為root,如果不是root使用者就報錯,并退出腳本,當root使用者執行腳本時,if語句不執行,正常執行fi之後的腳本代碼
8
<code>[root@localhost ~]</code><code># vim root.sh</code>
<code>if</code> <code>[ </code><code>"$USER"</code> <code>!= </code><code>"root"</code> <code>]</code>
<code> </code><code>echo</code> <code>"錯誤:非root使用者,權限不足"</code>
<code>exit</code> <code>1</code>
<code>fdisk</code> <code>-l </code><code>/dev/sda</code>
2. 雙分支的if語句
案例1:編寫一個測試連通性腳本,根據顯示結果給出相應的提示
9
10
11
12
13
14
<code>[root@localhost ~]</code><code># vim pinghost.sh</code>
<code>ping</code> <code>-c 3 -i 0.2 -W 3 $1 &> </code><code>/dev/null</code>
<code>if</code> <code>[ $? -</code><code>eq</code> <code>0 ]</code>
<code> </code><code>echo</code> <code>"Host $1 is up."</code>
<code>else</code>
<code> </code><code>echo</code> <code>"Host $1 is down."</code>
<code>[root@localhost ~]</code><code># . pinghost.sh 192.168.4.11</code>
<code>Host 192.168.4.11 is up.</code>
<code>[root@localhost ~]</code><code># . pinghost.sh 192.168.4.13</code>
<code>Host 192.168.4.13 is down.</code>
案例2:通過腳本檢測vsftpd服務是否運作,如果以運作則列出其監聽位址、PID号,否則輸出提示“警告:vsftpd服務不可用!”
15
16
17
<code>[root@localhost ~]</code><code># vim ftpd.sh</code>
<code>/etc/init</code><code>.d</code><code>/vsftpd</code> <code>status &> </code><code>/dev/null</code>
<code> </code><code>echo</code> <code>"監聽位址:$(netstat -anpt | grep vsftpd | awk '{print $4}')"</code>
<code> </code><code>echo</code> <code>"程序PID:$(pgrep -x vsftpd)"</code>
<code> </code><code>echo</code> <code>"警告:vsftpd服務不可用!"</code>
<code>[root@localhost ~]</code><code># sh ftpd.sh</code>
<code>警告:vsftpd服務不可用!</code>
<code>[root@localhost ~]</code><code># /etc/init.d/vsftpd start</code>
<code>監聽位址:0.0.0.0:21</code>
<code>程序PID:986</code>
3. 多分支的if語句
案例:編寫一個腳本,根據輸入考試分數來區分優秀、合格、不及格
<code>[root@localhost ~]</code><code># vim gradediv.sh</code>
<code>read</code> <code>-p </code><code>"請輸入您的分數(0-100):"</code> <code>GRADE</code>
<code>if</code> <code>[ $GRADE -</code><code>ge</code> <code>85 ] && [ $GRADE -</code><code>le</code> <code>100 ] </code>
<code> </code><code>echo</code> <code>"$GRADE 分!優秀"</code>
<code>elif</code> <code>[ $GRADE -</code><code>ge</code> <code>70 ] && [ $GRADE -</code><code>le</code> <code>84 ] </code>
<code> </code><code>echo</code> <code>"$GRADE 分,合格"</code>
<code> </code><code>echo</code> <code>"$GRADE 分?不合格”</code>
<code>[root@localhost ~]</code><code># sh gradediv.sh</code>
<code>請輸入您的分數(0-100):89</code>
<code>89 分!優秀</code>
本文轉自 楊書凡 51CTO部落格,原文連結:http://blog.51cto.com/yangshufan/2054138,如需轉載請自行聯系原作者