1.case基本概述
1.什么是case
case语句和 if 多分支判断语句类似,主要用来做多条件判 断,只不过 case 比 if 多分支条件判断更方便。至于方便在哪,我们看到后面示例就明白了。
2.case使用场景
在生产环境中,我们会根据”一个问题“ 做多种预案,然后根 据用户选择来加载不同的预案。
比如服务的启停脚本,我们首先要写好启动、停止、重启的 预案,然后根据用户选择传递的参数来加载不同的预案。
3.case基础语法
case 变量 in
条件 1)
执行代码块1
;;
条件 2)
执行代码块2
;;
条件 3)
执行代码块3
;;
*)
无匹配后命令序列
esac
4.case语句执行流程
[root@bgx shell]# cat case1.sh
#!/bin/bash
cat <<EOF
##############
## 1.backup ##
## 2.copy ##
## 3.quit ##
##############
EOF
read -p "请输入菜单编号:" action
case $action in
1|b)
echo "Backup..."
;;
2|c)
echo "Copy..."
;;
3|q)
exit
;;
*)
echo "error..."
esac
2.case练习题
需求1:使用case实现nginx服务启停脚本。
书写脚本思路
预案:
case $1 in
start)
#1.判断是否已经启动
启动:
提示Nginx已经启动
未启动:
执行命令启动Nginx
检查是否启动:
是:
启动成功
否:
启动失败
stop)
# 1.判断是否已启动,
启动:
关闭Nginx
检查是否关闭成功:
成功:
关闭Nginx成功
失败:
关闭Nginx失败
未启动:
提示Nginx已经关闭,无需重复关闭
*)
echo USAGE: $0 { start | stop }
exit
esac
脚本内容
. /etc/init.d/functions
ngx_pid_file=/var/run/nginx.pid
case $1 in
start)
#1.判断nginx是否启动
#启动
if [ -f ${ngx_pid_file} ];then
action "nginx已经启动,无需重复启动" /bin/true
#未启动
else
/usr/sbin/nginx
sleep 1
if [ $? -eq 0 ];then
action "nginx启动成功..." /bin/true
else
action "nginx启动失败..." /bin/false
fi
fi
;;
stop)
if [ -f ${ngx_pid_file} ];then
/usr/sbin/nginx -s stop
sleep 1
if [ $? -eq 0 ];then
action "nginx关闭成功..." /bin/true
else
action "nginx关闭失败..." /bin/flase
fi
fi
;;
*)
echo "USAGE: $0 { start |stop }"
exit
esac
执行脚本结果
需求2:使用case实现nginx状态监控脚本
我们第一步应该先在nginx配置文件中开启 监控nginx状态的模块
我们在这里通过curl 命令访问本地ip就可以,为什么用本地ip因为在生产环境中我们用shell脚本提取的是zabbix-agent端本地的nginx状态信息。
我们提取nginx七种状态信息的命令
访问本地我们配置的站点
curl http://127.0.0.1:80/nginx_status
下面是nginx七种状态对应的意思
我们用awk把每一种状态的数字筛选出来
==active connections值==
curl -s http://127.0.0.1:80/nginx_status |awk '/A/{print NR}'
==accepts值==
curl -s http://127.0.0.1:80/nginx_status|awk 'NR==3{print $1}'
==handled值==
curl -s http://127.0.0.1:80/nginx_status|awk 'NR==3{print $2}'
==request值==
curl -s http://127.0.0.1:80/nginx_status|awk 'NR==3{print $3}'
==reading值==
curl -s http://127.0.0.1:80/nginx_status |awk 'NR==4{print $2}'
==writing值==
curl -s http://127.0.0.1:80/nginx_status |awk 'NR==4{print $4}'
==waiting值==
curl -s http://127.0.0.1:80/nginx_status |awk 'NR==4{print $6}'
脚本内容
case $1 in
active)
curl -s http://127.0.0.1:80/nginx_status |awk '/A/{print NR}'
;;
accepts)
curl -s http://127.0.0.1:80/nginx_status|awk 'NR==3{print $1}'
;;
handled)
curl -s http://127.0.0.1:80/nginx_status|awk 'NR==3{print $2}'
;;
request)
curl -s http://127.0.0.1:80/nginx_status|awk 'NR==3{print $3}'
;;
reading)
curl -s http://127.0.0.1:80/nginx_status |awk 'NR==4{print $2}'
;;
writing)
curl -s http://127.0.0.1:80/nginx_status |awk 'NR==4{print $4}'
;;
waiting)
curl -s http://127.0.0.1:80/nginx_status |awk 'NR==4{print $6}'
;;
*)
echo "USAGE: $0 { active | accepts | handled | request | reading| writing | waiting }"
esac
执行脚本结果
需求3:根据用户输入服务名称查询服务状态
如果服务不存在则直接报错
如果服务启动则提示【重启和停止操作】
如果服务没有启动则提示【启动和取消操作】
那么首先我们的思路是如何去判断服务的运行状态
systemctl status 服务
echo "$?"
0 代表服务正常运行
3 代表服务存在但关闭
4 代表服务不存在
脚本内容
. /etc/init.d/functions
if [ $# -ne 1 ];then
echo "USAGE: $0 { nginx | httpd | vsftpd }"
exit
fi
systemctl status $1 &>/dev/null
result=$?
case $result in
0)
read -p "$1 服务正在运行,是否要重启或者停止 [ restart | stop ]:" action
case $action in
restart)
systemctl restart $1 &>/dev/null
if [ $? -eq 0 ];then
action "Restart $1 successfully" /bin/true
else
action "Restart $1 failing" /bin/true
fi
;;
stop)
systemctl stop $1 &>/dev/null
if [ $? -eq 0 ];then
action "Stop $1 successfully" /bin/true
else
action "Stop $1 failing" /bin/true
fi
;;
*)
echo "系统无法识别"
exit
esac
;;
3)
read -p "$1 服务没有启动,是否要启动或者取消操作 [ start | quit ]:" action
case $action in
start)
systemctl start $1 &>/dev/null
if [ $? -eq 0 ];then
action " Start $1 successfully" /bin/true
else
action " Start $1 failing " /bin/true
fi
;;
quit)
exit
;;
*)
echo "系统无法识别"
exit
esac
;;
4)
echo "$1 服务不存在!!!"
exit
;;
*)
echo "该状态脚本暂无支持!!"
esac
执行脚本结果