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

本文主要講解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語句的優點是更規範,易讀

相關文章
相關標籤/搜索