6.shell case控制语句

case控制语句

1.什么是case
case条件语句相当于多分支的if/elif/else条件语句,主要还是用来做条件判断的,常被应用于实现系统服务启动脚本。

case语句中,会将case获取的变量值与表达式部分的值1、值2、值3等逐个进行比较,如果变量值和某个表达式的值(例如值1)相匹配,就会执行值(例如值1)后面对应的指令(例如指令1,其可能是一组指令),直到执行到双分号(;;)才停止,然后再跳出case语句主体,执行case语句(即esac字符)后面的其他命令。 ​

如果没有找到匹配变量的任何值,则执行“*)”后面的指令(通常是给使用者的使用提示),直到遇到双分号(;;)此处的双分号可以省略或esac结束,这部分相当于if多分支语句中最后的else语句部分。


2.case的使用场景

  • 1.服务启停脚本 start、stop、restart、
  • 2.监控本地nginx状态,php状态这类脚本
  • 3.条件匹配,菜单选择时,必用case

3.case基础语法示例

  • case 变量 instart)执行的代码;;stop)执行的代码;;	restart)执行的代码;;*)echo "Usage: $0 [ start | stop | restart ]"
    esac
    

案例1:
根据输入的编号,输出对应的字符串

#!/bin/bashcat <<eof
****************
** 1. backup  **
** 2. copy    **
** 3. quit    **
****************
eofread -p "输入你选择的编号:" actioncase $action in1|backup) #使用竖线|可以匹配1或者backup,也就是可以用竖线来匹配多个值。echo "backup...";; #双封号记得要加2|copy)echo "copy...";;3)exit;;*) #没有匹配到任何值,则执行“*)”后面的指令echo "Usage: $0 [ 1 | 2 | 3 ]"exit
esac

案例2:

使用case来完成nginx服务的启动与停止,重启。

#!/bin/bashsource /etc/init.d/functionscase $1 instart)ngx_status=$(pidof nginx |wc -l)if [ $ngx_status -eq 1 ];then #如果返回1,说明有nginx进程,就无需再次启动action "nginx is starting" /bin/falseelsesystemctl start nginxaction "nginx is starting" /bin/truefi;;stop)pkill nginxif [ $? -eq 0 ];thenaction "nginx is stoped" /bin/trueelseaction "nginx is stoped" /bin/falsefi;;restart)pkill nginx && systemctl start nginxif [ $? -eq 0 ];thenaction "nginx is restart" /bin/trueelseaction "nginx is restart" /bin/falsefi;;status)systemctl status nginx;;*)echo "usage :$0 [ start | stop | restart | status ]"exit
esac

执行效果:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


案例3:
使用case编写监控nginx状态脚本

思路梳理:
获取nginx的状态 7种状态,将每种提取出来,然后执行脚本,根据用户输入的状态名称,输出状态值即可

如何获取nginx的七种状态指标?
vim /etc/nginx/conf.d/test.conf

server{listen 88;  #网站监听的端口server_name www.test.com;  #定义网站访问的域名location / {         #(location是用于控制用户请求的URI的路径的)root /test;   #定义站点代码存放的路径(根路径)index index.html;    #定义站点默认返回的页面}location /ngx_status {stub_status;      #展示nginx种状态指标}}

语法检测,重载nginx

nginx -t
systemctl reload nginx

查看状态指标结果
在这里插入图片描述

Active connections 当前的活跃连接数 ( 包含 waiting )
accepts	已接收的TCP连接数。
handled 已处理的TCP连接数。
requests 总的HTTP请求数。  (请求数大于连接数是正常的,因为一个连接可以创建多个请求)
Reading: nginx 读取到客户端的Header信息数
Writing: nginx 返回给客户端的Header信息数
Waiting: Nginx已经处理完,正在等候下一次请求指令的驻留链接

脚本:

#!/bin/bashread -p "输入要查看的状态指标: [ active_conn | accepts | handled | requests | reading | writing | waiting ]" actioncase $action inactive_conn)curl -s 127.0.0.1:88/ngx_status|awk -F ':' '/Active connections/{print $2}';;accepts)curl -s 127.0.0.1:88/ngx_status|awk 'NR==3{print $1}';;handled)curl -s 127.0.0.1:88/ngx_status|awk 'NR==3{print $2}';;requests)curl -s 127.0.0.1:88/ngx_status|awk 'NR==3{print $3}';;reading)curl -s 127.0.0.1:88/ngx_status|awk -F '[: ]+' 'NR==4{print $2}';;writing)curl -s 127.0.0.1:88/ngx_status|awk -F '[: ]+' 'NR==4{print $4}';;waiting)curl -s 127.0.0.1:88/ngx_status|awk -F '[: ]+' 'NR==4{print $6}';;*)echo "usage 输入下列指标: [ active_conn | accepts | handled | requests | reading | writing | waiting ]";;
esac

执行效果:
在这里插入图片描述
在这里插入图片描述


案例4:
使用case编写监控php-fpm状态脚本

如何开启php-fpm的状态?

开启php-fpm的状态
vim /etc/php-fpm.d/www.conf

找到该行并去掉前面的注释
pm.status_path = /fpm_status

systemctl restart php-fpm

配置nginx,让其通过http协议能获取php的状态信息

server{listen 89;server_name www.test.com;root /test;location / {index index.php index.html;}#将php结尾的请求文件都传递给本地php服务端处理
location ~ \.php$ {  #通过location进行匹配,访问的URI为.php结尾的都走这个locationfastcgi_pass 127.0.0.1:9000;     #将php结尾的请求文件都传递给本地php服务端处理fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  #为SCRIPT_FILENAME变量设定值(具体要解析的文件路径)include fastcgi_params;}#如果有请求fpm_status则交给php处理
location /fpm_status {fastcgi_pass 127.0.0.1:9000;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}
}

初始化本地目录文件
cat /test/index.php

 <?php phpinfo(); ?>

语法检测,重载nginx

nginx -t
systemctl reload nginx

查看效果

在这里插入图片描述

curl一下查看php-fpm状态
在这里插入图片描述

#!/bin/bashread -p "输入要查看的指标: [ pool | process manager | start time | start since | accepted conn | listen queue | max listen queue |listen queue len | idle processes |active processes |total processes |max active processes |max children reached |slow requests ]:" actioncase $action in"pool")curl -s 127.0.0.1:89/fpm_status | awk '/pool/{print $2}';;"process manager") #带空格的表达式,用双引号括起来,不然无法匹配curl -s 127.0.0.1:89/fpm_status | awk -F ': +' '/process manager/{print $2}';;"start time")curl -s 127.0.0.1:89/fpm_status | awk -F ': +' '/start time/{print $2}';;"start since")curl -s 127.0.0.1:89/fpm_status | awk -F ': +' '/start since/{print $2}';;"accepted conn")curl -s 127.0.0.1:89/fpm_status | awk -F ': +' '/accepted conn/{print $2}';;"listen queue")curl -s 127.0.0.1:89/fpm_status | awk -F ': +' '/^listen queue:/{print $2}';;"max listen queue")curl -s 127.0.0.1:89/fpm_status | awk -F ': +' '/max listen queue/{print $2}';;"listen queue len")curl -s 127.0.0.1:89/fpm_status | awk -F ': +' '/listen queue len/{print $2}';;"idle processes")curl -s 127.0.0.1:89/fpm_status | awk -F ': +' '/idle processes/{print $2}';;"active processes")curl -s 127.0.0.1:89/fpm_status | awk -F ': +' '/^active processes/{print $2}';;"total processes")curl -s 127.0.0.1:89/fpm_status | awk -F ': +' '/total processes/{print $2}';;"max active processes")curl -s 127.0.0.1:89/fpm_status | awk -F ': +' '/max active processes/{print $2}';;"max children reached")curl -s 127.0.0.1:89/fpm_status | awk -F ': +' '/max children reached/{print $2}';;"slow requests")curl -s 127.0.0.1:89/fpm_status | awk -F ': +' '/slow requests/{print $2}';;*)echo "usage 输入下列指标: [ pool | process manager | start time | start since | accepted conn | listen queue | max listen queue |listen queue len | idle processes |active processes |total processes |max active processes |max children reached |slow requests ]";;
esac

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


案例5:
编写脚本,根据用户输入的服务名称查询该服务的状态,如果服务不存在则直接报错。
如果服务启动则提示 [重启和停止操作],如果服务没有启动则提示 [启动和取消操作]

思路分析:
1.判断服务是否存在,不存在则直接报错
2.检查服务是否启动,
如果启动,则提示重启或停止
如果停止,则提示启动或取消操作
可以加入限定脚本的执行权限,只有root才能执行该脚本

先执行systemctl status 服务名,再执行echo $?来返回上一条命令执行返回的结果
得出
0: 启动
3: 停止
4: 不存在
在这里插入图片描述

#!/bin/bash
#1.确保该脚本是root用户执行
if [ $USER != "root" ];thenecho "$USER 对脚本 $0 没有执行权限!"exit
fi
#2.确保用户只能传递一个参数 
if [ $# -ne 1 ];thenecho "使用脚本 $0 时只能传递一个参数"exit
fi
#3.判断用户传递的服务名称情况
systemctl status $1 &>/dev/null
rc=$?
#4.如果服务不存在则报错
if [ $rc -eq 4 ];thenecho "服务 $1 不存在"exit
#5.检查服务是否启动或者是停止
elif [ $rc -eq 0 ];thenread -p "当前 $1 处于启动状态是否需要[ stop | restart ]" actioncase $action instop)systemctl stop $1;;restart)systemctl restart $1;;*)echo "请输入[ stop | restart]"exit;;esac
#6.检查服务是否停止,停止则提示启动或取消操作
elif [ $rc -eq 3 ];thenread -p "当前 $1 处于停止状态是否需要[ start |quit ]" action1case $action1 instart)systemctl start $1;;quit)exit;;*)echo "请输入[ start | quit]"exit;;esac
fi

脚本执行效果:

在这里插入图片描述
在这里插入图片描述


案例6:

以nginx为例,升级一下nginx的错误定向,当服务启动失败时候,可以选择修复,选择修复,就直接定位到报错的文件的具体行进行修复。

思路梳理:
根据nginx -t的输出,就可以定位到有问题的文件和有问题的行
将有问题的文件和有问题的行取出来
当选择修复时,直接编辑该文件的问题行即可
vim 问题文件 +问题行

在这里插入图片描述

#!/bin/bashif [ $USER != "root" ];thenecho "$USER 对脚本 $0 没有执行权限!"exit
fiif [ $# -ne 1 ];thenecho "使用脚本 $0 时只能传递一个参数"exit
fisystemctl status $1 &>/dev/null
rc=$?
if [ $rc -eq 4 ];thenecho "服务 $1 不存在"exitelif [ $rc -eq 0 ];thenread -p "当前 $1 处于启动状态是否需要[ stop | restart ]" actioncase $action instop)systemctl stop $1;;restart)systemctl restart $1;;*)echo "请输入[ stop | restart]"exit;;esac
elif [ $rc -eq 3 ];thenread -p "当前 $1 处于停止状态是否需要[ start |quit ]" action1case $action1 instart)systemctl start $1 &>/dev/nullif [ $? -eq 0 ];thenecho "启动成功!"elseread -p "服务 $1 启动失败,是否尝试修复[ repair|quit ]" action2case $action2 inrepair)nginx -t &> ngx.tmpngx_conf=$(awk -F '[: ]' 'NR==1 {print $8}' ngx.tmp) #哪个文件有问题ngx_line=$(awk -F '[: ]' 'NR==1 {print $9}' ngx.tmp)#哪行有问题vim ${ngx_conf} +${ngx_line} #直接定位到有问题的文件的有问题的那一行进行更改;;quit)exit;;*)echo "输入有误!再见";;esacfi;;quit)exit;;*)echo "请输入[ start | quit]"exit;;esac
fi

脚本执行效果:

在这里插入图片描述
输入修复选项,就直接打开了有问题的那个文件,并定位到了有问题的那行
在这里插入图片描述

修复完后,就可以成功启动了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/763389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法刷题】Day33

文章目录 1. 最长湍流子数组题干&#xff1a;算法原理&#xff1a;1. 状态表示&#xff1a;2. 状态转移方程3. 初始化4. 填表顺序5. 返回值 代码&#xff1a; 2. 最长递增子序列题干&#xff1a;算法原理&#xff1a;1. 状态表示&#xff1a;2. 状态转移方程3. 初始化4. 填表顺…

自学Python第二十九天-feapder框架创建爬虫

自学Python第二十九天-feapder框架创建爬虫 安装feapder 的设计架构feapder 框架的简单使用简单创建爬虫简单爬取数据简单的数据保存 中间件校验浏览器渲染使用浏览器渲染获取接口数据 feapder 项目 feapder是一款上手简单&#xff0c;功能强大的 Python爬虫框架&#xff0c;内…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(日期滑动选择器弹窗)

根据指定的日期范围创建日期滑动选择器&#xff0c;展示在弹窗上。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 本模块功能依赖UI的执行上下文&#xff0c;不可在UI上下文不明确的地方使用&…

【JS】如何避免输入中文拼音时触发input事件

现有一段代码&#xff0c;监听input事件。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" con…

SpringBoot+Vue项目(后端项目搭建 + 添加家居)

文章目录 1.使用版本控制管理该项目1.创建远程仓库2.克隆到本地 2.后端项目环境搭建1.创建一个maven项目2.删除不必要的文件夹3.pom.xml文件引入依赖4.application.yml 配置数据源&#xff08;注意&#xff0c;数据库名还没写&#xff09;5.com/sun/furn/Application.java 编写…

蓝桥杯算法心得——游戏(优先队列)

大家好&#xff0c;我是晴天学长&#xff0c;优先队列的题&#xff0c;式子化简非常重要&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .游戏 2) .算法思路 附近最小 1.接收数据 2.找出最小的&#…

安防监控平台EasyCVR使用管理员权限登录后,平台菜单栏显示不全是什么原因?

安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;平台能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;平台支持设备通过4G、5G、WIFI、有…

I2C协议

一.硬件连接 I2C必须使用开漏&#xff08;或集电极开路&#xff09;的引脚&#xff0c;其引脚框图如下所示。 SCL0对应78K0的P6.0引脚&#xff0c;SDA0对应78K0的P6.1引脚。 在使用开漏引脚通信时&#xff0c;需注意如下事项&#xff1a; 1&#xff09;两条总线须外接…

【Java - API - 多线程】(01) 通过Java 8完成多线程的创建,快速上手

通过"Java 8"完成多线程的创建&#xff0c;快速上手&#xff1b; 实操 【前提】 使用"Windows 11"系统通过"IntelliJ IDEA"软件完成&#xff1b; 【目录】 “方式1”&#xff1a;通过继承"Thread"完成-正常操作&#xff1b;“方式2”…

【QT入门】 Qt自定义信号后跨线程发送信号

往期回顾&#xff1a; 【QT入门】 lambda表达式(函数)详解-CSDN博客 【QT入门】 Qt槽函数五种常用写法介绍-CSDN博客 【QT入门】 Qt实现自定义信号-CSDN博客 【QT入门】 Qt自定义信号后跨线程发送信号 由于Qt的子线程是无法直接修改ui&#xff0c;需要发送信号到ui线程进行修改…

【Unity投屏总结】投屏方案总结

【背景】 想方便自己在VR中工作&#xff0c;打算做一个能够挂多个屏幕的远程控制VR桌面。研究下来发现细分场景有很多&#xff0c;有点鱼和熊掌不可兼得的意味&#xff0c;细分如下。 【投屏场景与解决方案】 希望多人能够同时观看我的屏幕&#xff0c;也就是一屏投多屏&…

C语言知识复盘— 递归算法 | 函数 | 数组

递归 ○ 算法思想&#xff1a; 递归算法分为两大阶段 : 递和归&#xff0c;即就是有去&#xff08;递去&#xff09;有回&#xff08;归来&#xff09;。 递去&#xff1a;将递归问题分解为若干个规模较小,与原问题形式相同的子问题,这些子问题可以用相同的解题思路来解决。归…

spring cloud项目微服务间互相调用使用自定义标注进行鉴权方案

来吧&#xff0c;贴代码。 一、背景 我们有一个项目使用了spring cloud&#xff0c;有的微服务需要调用别的微服务&#xff0c;但这些调用没有鉴权&#xff1b;当初项目时间非常紧&#xff0c;同时这部分微服务有的对外也没有鉴权&#xff0c;在代码中设置了无须鉴权&#xf…

字节跳动面试被拷打:高效处理大量数据的JavaScript技巧

一、文章内容 时间分片宏任务微任务前置内容实现时间分片 二、时间切片 什么是时间切片&#xff1f;通过字面意思我们不难理解时间切片就是将时间分成多个片段进行一一渲染数据,时间切片是个抽象的问题,我们可能会想到JavaScript中window自带的setTimeout的延迟函数或者是 w…

Docker进阶教程 - 2 Docker部署SpringBoot项目

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 2 Docker部署SpringBoot项目 已经学习了 Dockerfile 了&#xff0c;下面介绍一下如何将 SpringBoot 项目通过 Dockerfile 来部署到 Docker 中。 1 修改项目配置 首先需要准备一个 SpringBo…

初识二叉树

文章目录 一.什么是树二.什么是二叉树三.二叉树的访问次序四.特殊的二叉树五.求结点个数六.平衡二叉树总结 一.什么是树 树是由一个集合以及在该集合上定义的一种关系构成的。 集合中的元素称为树的节点&#xff0c;所定义的关系称为父子关系。 父子关系在树的节点之间建立了一…

安装OneNote for Win10 | Win10/Win11

前言 PC端的OneNote分为2个版本&#xff0c;分别是Microsoft Store版本和Office版本&#xff0c;Microsoft Store版本即为OneNote for Win10&#xff0c;此版的OneNote有最近笔记功能&#xff0c;但检索功能不如Office版本&#xff0c;个人认为2个版本各有优劣。 但OneNote f…

新人应该从哪几个方面掌握大数据测试?

什么是大数据 大数据是指无法在一定时间范围内用传统的计算机技术进行处理的海量数据集。 对于大数据的测试则需要不同的工具、技术、框架来进行处理。 大数据的体量大、多样化和高速处理所涉及的数据生成、存储、检索和分析使得大数据工程师需要掌握极其高的技术功底。 需要你…

nodejs中使用@maxmind/geoip2-node 查询地理位置信息

介绍 maxmind/geoip2-node 是一个Node.js模块&#xff0c;用于与MaxMind的GeoIP2数据库进行交互&#xff0c;从而获取IP地址的地理位置信息。MaxMind的GeoIP2数据库包含了全球范围内的IP地址和对应的地理位置信息&#xff0c;如国家、城市、经纬度等。使用maxmind/geoip2-node…

Python连接MariaDB数据库

2024软件测试面试刷题&#xff0c;这个小程序&#xff08;永久刷题&#xff09;&#xff0c;靠它快速找到工作了&#xff01;&#xff08;刷题APP的天花板&#xff09;【持续更新最新版】-CSDN博客 Python连接MariaDB数据库 一、安装mariadb库 pip install mariadb 二、连接…