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