本文主要讲解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语句的优势是更规范,易读