Linux Shell程式設計 條件判斷語法
if條件判斷語句
單分支 if 條件語句
語法格式:
if [條件判斷式];then 程式 fi
或者
if [條件判斷式] then 程式 fi
在使用單分支 if 條件查詢時需要注意幾點:
- if 語句使用 fi 結尾,和一般語言使用大括號結尾不同。
- [條件判斷式] 就是使用 test 命令判斷,所以中括號和條件判斷式之間必須有空格。
- then 後面跟符合條件之後執行的程式。可以放在 [] 之後,用";"分隔;也可以換行寫入,就不需要";":
示例:通過指令碼判斷根分割槽的使用率是否超過 80%,如果超過 80% 則向管理員報警。 :
[[email protected] ~]# df -h #檢視一下伺服器的分割槽狀況 檔案系統 容量 已用 可用 已用% %掛載點 /dev/sda3 20G 1.8G 17G 10% / tmpfs 306M 0 306M 0% /dev/shm /dev/sda1 194M 26M 158M 15% /boot /dev/srO 3.5G 3.5G 0100% /mnt/cdrom [[email protected] ~]# vi sh/if1.sh #!/bin/bash #統計根分割槽的使用率 rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d"%"-f1) #把根分割槽使用率作為變數值賦予變數rate if [$rate -ge 80 】 #判斷rate的值,如果大於等於80,則執行then程式 then echo 'Warning! /dev/sda3 is full!!" #列印警告資訊。在實際工作中,也可以向管理員傳送郵件 fi
"rate=$(df-h|grep "/dev/sda3"|awk'{print$5}'|cut-d"%"-f1)"命令:先使用"df-h"列出系統中的分割槽情況;然後使用"grep"命令提取出根分割槽行;再使用"awk"命令列出第五列,也就是根分割槽使用率這一列(不過使用率是 10%,不好比較,還要提取出 10 這個數字);最後使用"cut"命令(cut 命令比 awk 命令簡單),以"%"作為分隔符,提取出第一列。
雙分支條件語句
在雙分支 if 條件語句中,當條件判斷式成立時,則執行某個程式;當條件判斷式不成立時,則執行另一個程式。語法如下:
if [條件判斷式] then 當條件判斷式成立時,執行的程式 else 當條件判斷式不成立時,執行的另一個程式 fi
示例:
#!/bin/bash #判斷輸入的檔案是否是一個目錄 read -t 30 -p "Please input a directory:" dir #read接受鍵盤的輸入,並存入dir變數 if[-d $dir] #測試$dir中的內容是否是一個目錄 then echo "yes" #如果是一個目錄,則輸出yes else echo "no" #如果不是一個目錄,則輸出no fi
多分支 if 條件語句
在多分支 if 條件語句中,允許執行多次判斷。也就是當條件判斷式 1 成立時,執行程式 1;當條件判斷式 2 成立時,執行程式 2;依次類推,當所有條件不成立時,執行最後的程式。語法如下:
if[條件判斷式1] then 當條件判斷式1成立時,執行程式1 elif [條件判斷式2] then 當條件判斷式2成立時,執行程式2 …省略更多條件... else 當所有條件都不成立時,最後執行此程式、 fi
示例:用多分支 if 條件語句來判斷使用者輸入的是一個個檔案還是一個目錄。
[[email protected] ~]#vi sh/if-elif.sh #!/bin/bash #判斷使用者輸入的是什麼檔案 read -p "Please input a filename:" file #接收鍵盤的輸入,並賦予變數file if[-z "$file"] #判斷file變數是否為空 then echo "Error,please input a filename" #如果為空,則執行程式1,也就是輸出報錯資訊、 exit 1 #退出程式,並定義返回值為1 (把返回值賦予變數$?) elif[!-e "$file"] #判斷file的值是否存在 then echo 'Your input is not a file!" #如果不存在,則執行程式2 exit 2 #退出程式,並定義返回值為2 elif[-f "$file"] #判斷file的值是否為普通檔案 then echo "$file is a regulare file!" #如果是普通檔案,則執行程式3 elif[-d"$file"] #判斷file的值是否為目錄檔案 then echo "$file is a directory!" #如果是目錄檔案,則執行程式4 else echo is an other file!" #如果以上判斷都不是,則執行程式5 fi
exit 命令是退出執行程式的命令,如果符合條件 1(沒有輸入)和條件 2(輸入的不是檔案),則需要執行 exit 命令;否則程式還是會執行一下指令碼的。至於 exit 後面的返回值,是自由定義的,主要用於把返回值賦予變數 $?。
示例:
[[email protected] ~]# chmod 755 sh/if-elif.sh #賦予執行許可權 [[email protected] ~]# sh/if-elif.sh #執行指令碼 Please input a filename: #沒有任何輸入 Error,please input a filename #報錯資訊是指令碼中自己定義的 [[email protected] ~]# echo $? 1 #變數$?的返回值是我們自己定義的1 [[email protected] ~]# sh/if-elif.sh Please input a filename: jkgeia #隨便輸入不是檔案的字串 Your input is not a file! #報錯資訊是自己定義的 [[email protected] ~]# echo $? 2 #變數$?的返回值是我們自己定義的2
case多分支條件判斷
case 語句和 if...elif...else 語句一樣都是多分支條件語句,不過和多分支 if 條件語句不同的是,case 語句只能判斷一種條件關係,而 if 語句可以判斷多種條件關係。
case 語句的語法如下:
case $變數名 in "值 1") ;; 如果變數的值等於值1,則執行程式1,值 2") 如果變數的值等於值2,則執行程式2 …省略其他分支… *) 如果變數的值都不是以上的值,則執行此程式 ;; esac
case 語句會取出變數中的值,然後與語句體中的值逐一比較。如果數值符合,則執行對應的程式;如果數值不符,則依次比較下一個值;如果所有的值都不符合,則執行"*)"("*"代表所有其他值)中的程式。
case 語句以"case"開頭,以"esac"結尾。
在每個分支程式之後要以";;"(雙分號)結尾,代表該程式段結束。
示例如下:
[[email protected] ~]# vi sh/case.sh #!/bin/bash #判斷使用者輸入 read -p "Please choose yes/no: " -t 30 cho #在螢幕上輸出"請選擇yes/no",然後把使用者選擇賦予變數cho case $cho in #判斷變數cho的值 "yes") #如果是yes echo "Your choose is yes!" #則執行程式1 ;; "no") #如果是no echo "Your choose is no!" #則執行程式2 ;; *) #如果既不是yes,也不是no echo "Your choose is error!" #則執行此程式 ;; esac
請使用者輸入 yes 或 no,如果輸入的是 yes,則輸出"Your choose is yes!";如果輸入的是 no,則輸出"Your choose is no!";如果輸入的是其他字元,則輸出"Your choose is error!"。