使用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這個目錄是否存在,若不存在則新建此目錄
[root@localhost ~]# vim dir.sh #!/bin/bash DIR="/media/cdrom/" if [ ! -d $DIR ] then mkdir -p $DIR fi
案例2:判斷當前用戶是否為root,如果不是root用戶就報錯,並退出腳本,當root用戶執行腳本時,if語句不執行,正常執行fi之後的腳本代碼
[root@localhost ~]# vim root.sh #!/bin/bash if [ "$USER" != "root" ] then echo "錯誤:非root用戶,權限不足" exit 1 fi fdisk -l /dev/sda
2. 雙分支的if語句
案例1:編寫一個測試連通性腳本,根據顯示結果給出相應的提示
[root@localhost ~]# vim pinghost.sh #!/bin/bash ping -c 3 -i 0.2 -W 3 $1 &> /dev/null if [ $? -eq 0 ] then echo "Host $1 is up." else echo "Host $1 is down." fi [root@localhost ~]# . pinghost.sh 192.168.4.11 Host 192.168.4.11 is up. [root@localhost ~]# . pinghost.sh 192.168.4.13 Host 192.168.4.13 is down.
案例2:通過腳本檢測vsftpd服務是否運行,如果以運行則列出其監聽地址、PID號,否則輸出提示“警告:vsftpd服務不可用!”
[root@localhost ~]# vim ftpd.sh #!/bin/bash /etc/init.d/vsftpd status &> /dev/null if [ $? -eq 0 ] then echo "監聽地址:$(netstat -anpt | grep vsftpd | awk '{print $4}')" echo "進程PID:$(pgrep -x vsftpd)" else echo "警告:vsftpd服務不可用!" fi [root@localhost ~]# sh ftpd.sh 警告:vsftpd服務不可用! [root@localhost ~]# /etc/init.d/vsftpd start [root@localhost ~]# sh ftpd.sh 監聽地址:0.0.0.0:21 進程PID:986
3. 多分支的if語句
案例:編寫一個腳本,根據輸入考試分數來區分優秀、合格、不及格
[root@localhost ~]# vim gradediv.sh #!/bin/bash read -p "請輸入您的分數(0-100):" GRADE if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] then echo "$GRADE 分!優秀" elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] then echo "$GRADE 分,合格" else echo "$GRADE 分?不合格” fi [root@localhost ~]# sh gradediv.sh 請輸入您的分數(0-100):89 89 分!優秀
使用if語句編寫Shell腳本