Shell腳本應用(二)
[重點]
Ø整數值比較/邏輯測試
ØIf語句的結構及應用
2.1條件測試操作
Shell環境根據命令執行後的返回狀態值($?)來判斷是否執行成功。當返回值爲0時表示成功,否則(非0值)表示失敗或異常
使用專門的測試工具---test命令,可對特定條件進行測試,並根據返回值來判斷條件(返回值0表示條件成立)
使用test測試包括兩種形式:
Test 條件表達式或者 [ 條件表達式 ]
這兩種方式作用完全相同,但通常後一種形式更爲常用。
注意:方括號[ ]與條件表達式之間需要至少一個空格進行分隔
比較常用的條件操作:
文件測試、整數值比較、字符竄比較、以及針對抖個條件的邏輯測試。
1.文件測試:根據給定的路徑名稱,判斷對應的是文件還是目錄,或者判斷文件上是否可讀、可寫、可執行等。
常見的操作選項如下:使用時將測試對象放在操作選項之後即可
l-d:測試是否爲目錄(directory)
l-e:測試目錄或文件是否存在(exsit)
l-f:測試文件或目錄是否存在(file)
l-r:測試當前用戶是否有權限讀取(read)
l-w:測試當前用戶是否有權限寫入(write)
l-x:測試是否設置有可執行(excute)權限
列:[ -d /media/cdrom/ ]
Echo $?
Ls -ld /media/cdrom/
爲了更直觀的查看測試結果,可以結合命令分隔符“&&”和echo命令一起使用,當條件成立時直接輸出“yes”。其中“&&”符號表示“而且”的關係,只有當前前邊的命令執行成功後纔會執行後邊的命令,否則後邊的命令將會被忽略。
列:[ -d /media/cdrom/Server/ ] && echo “YES”
2.整數值比較:根據給定的兩個整數值,判斷第1個數是否大於、等於、小於….第2個數
整數值比較的常用操作選項如下:(使用時將操作選項放在要比較的兩個整數之間)
l-eq:第1個數等於(equal)第2個數
l-ne:第1個數不等於(not equal)第2個數
l-gt:第1個數大於(greater than)第2個數
l-lt:第1個數小於(lesser than)第2個數
l-le:第1個數小於等於(lesser or equal)第2個數
l-ge:第1個數大於等於(greater or equal)第2個數
列:who |wc -l
[ $Unum -gt 5 ] && echo “Too many”
Free –m: 表示已MB爲單位輸出內存信息
列:freeCC=$(free -m | grep “cache:”| awk ‘{print $4}’)
[ $freeCC -lt 1024 ] && echo ${freeCC}MB
3.字符串比較:通常用來檢查用戶輸入/系統環境是否滿足條件
在提供交互式操作的shell腳本中,也可用於判斷用戶輸入參數是否符合要求
字符串常用操作選項:
l=:第1個字符串與第2個字符串相同
l!=:第1個字符串與第2個字符串不相同,其中!取反的意思
l-z:檢查字符是否爲空(zero),對於未定義或賦予空值的變量視爲空串
列:echo $LANG //查看當前語言環境
[ $LANG != “en.US” ] && echo “Not en.US” //字符串測試結果
在shell腳本應用中,經常需要用戶輸入yes或no來確認某個任務
列: read -p “是否覆蓋現有文件(yes/no)?” ACK
[ $ACK =“yes” ] && echo “覆蓋”
4.邏輯測試:判斷兩個或多個條件之間的依賴關係
常用邏輯測試的操作選項:
l&&:邏輯與,表示“而且”的意思,只有當前後兩個條件都成立時,整個測試名令的返回值才爲0(結果成立)。使用test名令時,“||”可改爲“-a”
l||:邏輯或,表示“或者”的意思,只要前後兩個條件中有一個成立時,整個測試名令的返回值才爲0(結果成立)。使用test名令時,“||”可改爲“-o”
l! :邏輯否,表示“不”的意思,只有當條件不成立時,整個測試名令的返回值才爲0(結果成立)。
注: “&&” 和“||”通常也用於間隔不同名令操作
如:make && make install
列:判斷當前linux系統內核版本是否大於2.4
Uname -r
Mnum= $(uname –r | awk -F. ‘{print $1}’)
Snum=$(uname -r | awk -F. ‘{print $2}’)
[ $Mnum -eq 2 ] && [ $Snum -gt 4 ] && echo “符合要求”
2.2使用if語句
使用專用的if語句,可以更好的整理腳本結構,使得層次分明,清晰易懂
2.2.1 If語句結構
在shell腳本應用中,if語句是最常用的一種流程控制方式。
If選擇結構可以分爲三種不同的基本類型:適用於不同的應用場合。
1.單分支結構
If語句的“分支”指的的是不同測試結果對應的執行語句(一條或多條)。
對於單分支語句,只有在“條件成立”時纔會執行相應的代碼,否則不作任何操作。
單分支If語句語法格式:
if 條件測試
then
命令序列
fi
單分支If結構的執行流程:
首次判斷條件測試的操作結果,如果返回值爲0 表示條件成立,則執行then後面的名令序列,一直到遇見fi爲止表示結束,繼續執行其他腳本代碼;如果返回值不爲0,則忽略then後面的命令序列,直接跳至fi 行以後執行其他腳本代碼。
單分支If語句結構:
2.雙分支的if語句
雙分支的if語句格式:if 條件測試操作
then
命令序列1
else
命令序列2
fi
雙分支的if結構執行流程:
首先判斷條件測試的操作結果,如果條件成立,則執行then後面的命令序列1,忽略else及後面的命令序列2,直到遇見fi 結束判斷;如果條件不成立,則忽略then後面的命令序列1,直接跳至else及後面的命令序列2執行,直到遇見fi 結束判斷。
雙分支的if語句結構:
3.多分支的if語句
多分支的if語句的語法格式:if 條件測試操作1
then
命令序列1
elif 條件測試操作2
Then
命令序列2
else
命令序列2
fi
多分支的if結構的執行流程:
首先判斷條件測試的操作1的結果,如果條件1成立,則執行命令序列1,然後跳至fi 結束判斷;如果條件1不成立,則繼續判斷條件測試操作2的結果,如果條件2成立,則執行命令序列2,然後跳至fi 結束判斷;……如果所有的條件多不滿足,則執行else後面的命令序列n,然後遇見fi 結束判斷。
多分支的if語句結構:
2.2.2 if語句應用
單分支語句應用:
列:vi /opt/chkifroot.sh
#!/bin/bash
If [ “$USER” !=”root” ]
then
echo “錯誤:非root用戶,權限不足”
exit 1 //非正常退出
fi
#chmod +x chkifroot.Sh
#/opt/chkfiroot.sh
列:
雙分支 if語句應用:
編寫連通性測試腳本pinghost.sh
列:vi 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
#chmod +x pinghost.sh
#./pinghost.sh 192.168.4.1
多分枝語句因應用:
根據多個互斥的條件執行不同的操作,實際等同於嵌套使用的if語句。
編寫一個成績分檔的腳本
列: vi gradediv.sh
#!/bin/bash
Read –p “請輸入您的分數(0-100)” GRADE
If [ $GRADE –ge $5 ] && [ $GRADE -le 100 ]
Then
Echo “ $GRADE 分,優秀”
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
echo “$GRADE 分,合格”
else
echo “$GRADE 分,不合格”
f
#chmod +x gradeediv.sh
#./ gradeediv.sh