天天看點

使用if語句編寫Shell腳本

    在簡單的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 &amp;&gt; </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 &amp;&gt; </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 ] &amp;&amp; [ $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 ] &amp;&amp; [ $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,如需轉載請自行聯系原作者