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(选择有向无环图)的形式。…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...