本文主要講解Shell腳本開發中case條件語句的知識與實踐nginx
基本大綱:bash
1.case條件語句的語法網絡
2.case條件語句基本實踐ide
3.Linux系統腳本運用case條件語句範例函數
4.case語句小結this
一: case條件語句的語法spa
case條件語句至關於多分支的if/elif/else條件語句,可是它比這些條件語句看起來更規範更工整,常被應用於實現系統服務啓動腳本等企業應用場景中rest
case條件語句的語法格式爲:server
case "變量" inip
值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語句的優點是更規範,易讀