C語言中文網 目錄
首頁 > Linux入門 > Shell編程 閱讀:2,868

Shell if條件判斷語句用法詳解

< 上一頁Shell test命令 Shell case語句下一頁 >

if 條件判斷在語言中最為常見,主要用于判斷條件是否成立,比如在課堂上,并不是所有的學員都可以進入教室,而是必須符合條件(如必須是本班級學員)才能進入教室。當然,在上課時,是通過人的大腦進行判斷的;如果在程序語言中,就要通過 if 條件判斷語句來判斷了。

單分支 if 條件語句

單分支 if 條件語句最為簡單,就是只有一個判斷條件,如果符合條件則執行某個程序,否則什么事情都不做。語法如下:

if [條件判斷式];then
程序
fi

在使用單分支 if 條件查詢時需要注意幾點:
  • if 語句使用 fi 結尾,和一般語言使用大括號結尾不同。
  • [條件判斷式] 就是使用 test 命令判斷,所以中括號和條件判斷式之間必須有空格。
  • then 后面跟符合條件之后執行的程序,可以放在 [] 之后,用":"分隔;也可以換行寫入,就不需要":"了,比如單分支 if 條件語句還可以這樣寫:

if [條件判斷式]
then
程序
fi

單分支 if 條件語句非常簡單,但是千萬不要小看它,這是流程控制語句最基本的語法。而且在實現 Linux 管理時,我們的管理腳本一般都不復雜,單分支 if 條件語句使用的概率還是很大的。

舉個例子,我想通過腳本判斷根分區的使用率是否超過 80%,如果超過 80% 則向管理員報警,請他注意。 腳本就可以這樣寫:

[root@localhost ~]# 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
[root@localhost ~]# 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 命令簡單),以"%"作為分隔符,提取出第一列。

這條命令的執行結果如下:

[root@localhost ~]# df -h | grep "/dev/sda3" |awk'{print $5}'|cut -d"%" -f1 10

提取出根分區的使用率后,判斷這個數字是否大于等于 80,如果大于等于 80 則報警。至于報警信息,我們在腳本中直接輸出到屏幕上。在實際工作中,因為服務器屏幕并不是 24 小時有人值守的,所以也可以給管理員發送郵件,用于報警。

腳本寫好之后,就可以利用我們在前面章節中講到的系統定時任務,讓這個腳本每天或幾天執行一次,就可以實現自動檢測硬盤剩余空間了。后續的系統管理的腳本,如果需要重復執行,則也需要依賴系統定時任務。

雙分支條件語句

在雙分支 if 條件語句中,當條件判斷式成立時,則執行某個程序;當條件判斷式不成立時,則執行另一個程序。

語法如下:

if [條件判斷式]
then
當條件判斷式成立時,執行的程序
else
當條件判斷式不成立時,執行的另一個程序
fi

例如,還記得我們在進行條件測試時是怎么顯示測試結果的嗎?

[root@localhost ~]# [-d /root/sh] && echo "yes" || echo "no"
#第一條判斷命令如果正確執行,則打印"yes"; 否則打印"no"
yes

這樣顯示條件測試的結果還是非常不方便的。當時是因為我們還沒有講 if 語句,所以只能用邏輯與和邏輯或來顯示測試結果。既然我們已經學習了 if 語句,就把這個條件測試改寫為 if 語句吧。

#!/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

解釋一下這個腳本的思路:其實邏輯與和邏輯或也是在判斷前一條命令的"$?"的返回值是不是 0,如果是 0,則前一條命令正確執行;如果不是 0,則證明前一條命令執行錯誤。雙分支if條件語句的判斷思路也是測試條件判斷式是否成立,如果成立,則執行"then"中的命令;如果不成立,則執行"else"中的命令。

多分支 if 條件語句

在多分支 if 條件語句中,允許執行多次判斷。也就是當條件判斷式 1 成立時,執行程序 1;當條件判斷式 2 成立時,執行程序 2;依次類推,當所有條件不成立時,執行最后的程序。語法如下:

if[條件判斷式1]
then
當條件判斷式1成立時,執行程序1
elif [條件判斷式2]
then
當條件判斷式2成立時,執行程序2
…省略更多條件...
else
當所有條件都不成立時,最后執行此程序、
fi

例如,用多分支 if 條件語句來判斷用戶輸入的是一個個文件還是一個目錄。

[root@localhost ~]#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 后面的返回值,是自由定義的,主要用于把返回值賦予變量 $?。我們執行一下這個腳本:

[root@localhost ~]# chmod 755 sh/if-elif.sh
#賦予執行權限
[root@localhost ~]# sh/if-elif.sh
#執行腳本
Please input a filename:
#沒有任何輸入
Error,please input a filename
#報錯信息是腳本中自己定義的
[root@localhost ~]# echo $?
1
#變量$?的返回值是我們自己定義的1
[root@localhost ~]# sh/if-elif.sh
Please input a filename: jkgeia
#隨便輸入不是文件的字符串
Your input is not a file!
#報錯信息是自己定義的
[root@localhost ~]# echo $?
2
#變量$?的返回值是我們自己定義的2

< 上一頁Shell test命令 Shell case語句下一頁 >

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo