1. 程式人生 > >Shell筆記6——case條件語句的知識與實踐

Shell筆記6——case條件語句的知識與實踐

linux 運維 shell腳本

本文主要講解Shell腳本開發中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條件語句的知識與實踐