本文主要讲解 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 语句的优势是更规范, 易读
来源: http://www.bubuko.com/infodetail-2634282.html