shell-03-case判断语句

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

执行脚本结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值