1. 程式人生 > >使用if語句編寫Shell腳本

使用if語句編寫Shell腳本

shell腳本 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這個目錄是否存在,若不存在則新建此目錄

[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腳本