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
脚本执行效果:

输入修复选项,就直接打开了有问题的那个文件,并定位到了有问题的那行

修复完后,就可以成功启动了

相关文章:
6.shell case控制语句
case控制语句 1.什么是case case条件语句相当于多分支的if/elif/else条件语句,主要还是用来做条件判断的,常被应用于实现系统服务启动脚本。 case语句中,会将case获取的变量值与表达式部分的值1、值2、值3等逐个进行比较,如果变量值和某个表…...
如何判断HDMI接口版本是1.4还是2.0呢?
如何判断HDMI接口版本是1.4还是2.0呢? HDMI是一种用于传输高质量音频和视频信号的接口标准。随着技术的不断发展,HDMI接口也经历了多次升级和改进。在市场上,常见的HDMI接口版本包括1.4和2.0。判断HDMI接口版本主要通过以下几种方法ÿ…...
【开发环境搭建篇】NodeJS的安装和配置
作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是࿰…...
【Docker】docker和docker-compose一键安装脚本(linux)
一、准备和运行脚本 当前脚本下载的docker和docker-compose兼容系统架构为x64,可以根据自己实际系统版本更改下载链接 1. 在控制台使用vim新建: vim install-docker.sh2. 复制内容并粘贴: #!/usr/bin/env bash # 设置脚本在遇到错误时终止执行 set -…...
在 Windows 中安装配置并启动运行 Jenkins【图文详细教程】
安装 Jenkins 的系统要求: 最少 256MB 可用内存最少 1GB 可用磁盘空间JDK 8 / 11 /17(Jenkins 是用 Java 写的,打包成 war 包) 查看 JDK 的版本 Java JDK 在 Windows 中安装可以参考:https://www.yuque.com/u27599042/…...
C# 读取txt文本所有行
引用:System.IO; Path.Combine(); //将字符串组合成一个路径 Path.GetFullPath(); //返回指定路径的绝对路径 File.ReadAllLines(); //读取文本框返回一个数组 File.ReadAllText(); //读取文本框返回一个字符串 File.ReadAllBytes(); //读取文本框返回字节 …...
STM32使用常见错误合集(正在更新版)
本文章记录一些学习STM32的一些错误问题,师承江科大哈哈哈 一、编译、烧录类问题 1、烧录不成功,Keil提示RDDI-DAP Error【场景:PWM驱动直流电机】 解决方案:将电机断开再进行烧录,断开后就可以美美烧录不报错啦~ …...
Java Random类
一、Random类 在项目开发中,经常需要使用随机数值,例如,网站登录中的验证码,或者需要以一定概率实现的某种效果(如游戏程序中的物品掉落等),就需要Java提供的Random类,该类用于生成…...
【Spring Cloud】微服务通信概述
SueWakeup 个人主页:SueWakeup 系列专栏:学习技术栈 个性签名:人生乏味啊,我欲令之光怪陆离 本文封面由 凯楠📷 友情赞助播出 目录 前言 1. Dubbo(Spring Cloud Alibaba)和 Spring Cloud 的适…...
MySQL的概述与安装
一、数据库的基本概念: 1.1 数据: 1) 描述事物的符号记录称为数据(Data)。数字、文字、图形、图像、声音、档案记录等 都是数据。 2)数据是以“记录”的形式按照统一的格式进行存储的,而不是…...
《被讨厌的勇气》书摘2
发生什么不重要,怎样看待才重要 生活的真谛就是活在当下 来自他人和社会的评价,造成了我们的骄傲和自卑。人们经常借“爱”之名,行控制之实 学会课题分离 当我们发现自己的价值的时候,才具备了让自己真正自由和自主的勇气 人…...
基于SpringBoot的会员制医疗预约服务管理信息系统
开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea 系统展示 系统功能模块 会员制医疗预约服务管…...
【二十三】【算法分析与设计】三柱汉诺塔详解,计算子移动次数,正常递归计算,观察数据得出数学规律,递归图得出数学规律,将递归函数转化为递推式
目录 汉诺塔递归 汉诺塔子移动次数的计算 牛牛的汉诺塔 选择正常的递归模拟计算子移动次数 根据具体数据得出数学规律 根据递归图得出数学规律 将递归函数转化为递推式 结尾 汉诺塔递归 汉诺塔是一个经典问题,相传在古印度圣庙中,有一种被称为汉…...
C# WPF编程-XAML
C# WPF编程-XAML XAML简述XAML子集XAML编译XAML基础XAML名称空间XAML中的属性和事件属性事件使用其他名称空间中的类型 加载和编译XAML XAML简述 XAML(Extensible Application Markup Language的简写,发音"zammel")是用于实例化.NET对象的标记语言。XAML…...
java 高级面试题(借鉴)(下)
雪花算法原理 第1位符号位固定为0,41位时间戳,10位workId,12位序列号,位数可以有不同实现。 优点:每个毫秒值包含的ID值很多,不够可以变动位数来增加,性能佳(依赖workId的实现…...
C++测试代码
C测试代码 目录 基于C实现的AOP功能 基于C实现的AOP功能 #include <iostream> #include <string>struct LogHeader {std::string prefix;std::string aspect; };template <typename T> void before(const std::string& msg, const LogHeader& heade…...
Flask python 开发篇:蓝图的使用
蓝图 引言一、为什么使用蓝图?二、蓝图的概念三、创建蓝图四、注册蓝图五、分享我的creat_app方法六、写在最后 引言 falsk是个轻量级的框架,核心实现简单,但同事可以让开发人员自由的扩展功能。开发中,使用模块导入的方式。 一…...
抖音视频爬虫下载软件|可导出视频分享链接|视频批量采集工具
无水印视频关键词批量下载工具操作指南 我们自主开发了一款便捷的音视频批量下载工具,不仅支持单个视频链接提取,还可通过关键词搜索实现批量采集和选择性下载,让您轻松获取所需视频内容。 操作说明: 关键词批量采集视频 进入软件…...
CentOS DHCP服务器部署指南
title: DHCP 服务器部署以及配置 search: 2024-03-21 tags: “#DHCP 服务器部署以及配置” CentOS DHCP 服务器部署指南 背景 :因上了 Linux 的实验课程,在课程中,老师要求我们自己搭建 DHCP 服务器构建局域网,在构建的时候问题百…...
llvm后端
SelectionDAGBuilder是LLVM(Low Level Virtual Machine)编译器中的一个重要组件,它负责将LLVM中间表示(Intermediate Representation,IR)转换为SelectionDAG(选择有向无环图)的形式。…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
算法刷题-回溯
今天给大家分享的还是一道关于dfs回溯的问题,对于这类问题大家还是要多刷和总结,总体难度还是偏大。 对于回溯问题有几个关键点: 1.首先对于这类回溯可以节点可以随机选择的问题,要做mian函数中循环调用dfs(i&#x…...
CMS内容管理系统的设计与实现:多站点模式的实现
在一套内容管理系统中,其实有很多站点,比如企业门户网站,产品手册,知识帮助手册等,因此会需要多个站点,甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...
