Shell筆記6——case條件語句的知識與實踐
基本大綱:
1.case條件語句的語法
2.case條件語句基本實踐
3.Linux系統腳本運用case條件語句範例
4.case語句小結
一: case條件語句的語法
case條件語句相當於多分支的if/elif/else條件語句,但是它比這些條件語句看起來更規範更工整,常被應用於實現系統服務啟動腳本等企業應用場景中
case條件語句的語法格式為:
case "變量" in
值1)
指令1...
;;
值2)
指令2...
;;
*)
指令3...
esac
重要說明:當變量的值等於值1時,執行指令1;等於值2時執行指令2,以此類推;如果都不符合,則執行”*)“後面的指令,即指令3。此外,註意不同行內容的縮進距離。
二:case條件語句基本實踐
範例:根據用戶的輸入判斷用戶輸入的是哪個數字。
如果用戶輸入的是1~9的任意數字,則輸出對應數字的提示;如果是其它數字及字符,則返回輸入不正確的提示並退出程序
[root@aliyun case]# cat case.sh #!/bin/bash #Author:ywxi #Time:2018-06-07 04:32:49 #Version:V1.0 read -p "Please input a number:" a #打印信息提示用戶輸入,輸入信息賦值給a變量 case "$a" in 1) echo "the num you input is 1." ;; 2) echo "the num you input is 2." ;; [3-9]) echo "the num you input is $a" ;; *) echo "please input [0-9] int" exit; esac [root@aliyun case]# sh case.sh Please input a number:1 the num you input is 1. [root@aliyun case]# sh case.sh Please input a number:2 the num you input is 2. [root@aliyun case]# sh case.sh Please input a number:3 the num you input is 3 [root@aliyun case]# sh case.sh Please input a number:123 please input [0-9] int
三:Linux系統腳本運用case條件語句範例
範例:使用yum命令安裝Nginx後,對Nginx自帶的啟動服務腳本進行全文註釋
[root@aliyun case]# cat /etc/init.d/nginx #!/bin/sh # # nginx - this script starts and stops the nginx daemon #功能註釋 # # chkconfig: - 85 15 #開機自啟設置 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ #對腳本的描述 # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /etc/sysconfig/nginx # pidfile: /var/run/nginx.pid # Source function library. . /etc/rc.d/init.d/functions #加載系統函數庫functions # Source networking configuration. . /etc/sysconfig/network #加載網絡配置 # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 #檢查網絡服務是否啟動,如果為no,則退出腳本 nginx="/usr/sbin/nginx" #將啟動命令復制給變量Nginx prog=$(basename $nginx) #取變量中的名稱部分,即為nginx NGINX_CONF_FILE="/etc/nginx/nginx.conf" #定義Nginx配置文件路徑 [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx #如果存在nginx就加載 lockfile=/var/lock/subsys/nginx #定義鎖文件路徑 start() { 定義start函數 [ -x $nginx ] || exit 5 #如果$nginx可執行不成立,則退出腳本 [ -f $NGINX_CONF_FILE ] || exit 6 #如果配置文件不存在,則退出腳本 echo -n $"Starting $prog: " #打印開始啟動提示 daemon $nginx -c $NGINX_CONF_FILE #指定配置文件啟動Nginx服務 retval=$? #將啟動命令的返回值復制給retval,後面會進行判斷 echo #打印空行 [ $retval -eq 0 ] && touch $lockfile #如果返回值為0,則創建鎖文件,這個鎖可理解為服務啟動成功標識 return $retval #將返回值返回腳本 } stop() { #stop函數 echo -n $"Stopping $prog: " #打印停止提示 killproc $prog -QUIT #使用killproc函數指定參數停止Nginx服務 retval=$? #將啟動命令的返回值復制給retval,後面會進行判斷 echo [ $retval -eq 0 ] && rm -f $lockfile #如果返回值為0,則刪除鎖文件,這個鎖可以理解為服務是否成功的標識,因為關閉服務成功了,所以刪除鎖文件 return $retval #將返回值返回腳本 killall -9 nginx #強制殺死Nginx服務 } restart() { #restart函數 configtest || return $? #如果檢查語法不成功,則退出函數 stop #執行停止函數 sleep 1 #休息1秒 start #執行啟動函數 } reload() { #重新加載配置函數 configtest || return $? #如果檢查語法不成功,則退出函數 echo -n $"Reloading $prog: " killproc $nginx -HUP #使用killproc函數指定參數停止Nginx服務,註意-HUP為優雅停止函數,即不影響用戶體驗 RETVAL=$? echo #打印空行 } force_reload() { restart } configtest() { #檢查語法的函數 $nginx -t -c $NGINX_CONF_FILE #-t為檢查語法,-c為指定配置文件 } rh_status() { #狀態函數 status $prog #打印Nginx服務狀態 } rh_status_q() { #安靜的狀態檢查函數 rh_status >/dev/null 2>&1 #輸出和錯誤都定向到空 } case "$1" in #關鍵內容開始,獲取傳參值 start) rh_status_q && exit 0 #如果狀態檢查是成功的,則退出腳本,即不需要啟動 $1 #獲取$1值,執行start函數 ;; stop) rh_status_q || exit 0 #如果狀態檢查成功不成立,則退出腳本,即不需要停止 $1 #獲取$1值,執行stop函數 ;; restart|configtest) $1 #獲取$1值,執行restart等函數 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) #若不匹配上述值的內容,則打印使用幫助提示,並退出腳本 echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac
四:case語句小結
1)case語句和if條件語句的適用性
case語句比較適合變量值較少且為固定的數字或字符串集合的情況,如果變量的值是已知固定的start/stop/restart等元素,那麽采用case語句來實現就比較適合
2)case語句和if條件語句的常見應用場景
case主要是寫服務的啟動腳本,一般情況下,傳參不同且具有少量的字符串,其適用範圍較窄
if就是取值判斷,比較,應用面比case更廣。幾乎所有的case語句都可以用if條件語句來實現
3)case語句的特點及優勢
case語句就相當於多分支的if/elif/else語句,但是case語句的優勢是更規範,易讀
Shell筆記6——case條件語句的知識與實踐