当前位置: 首页 > news >正文

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条件语句&#xff0c;主要还是用来做条件判断的,常被应用于实现系统服务启动脚本。 case语句中&#xff0c;会将case获取的变量值与表达式部分的值1、值2、值3等逐个进行比较&#xff0c;如果变量值和某个表…...

如何判断HDMI接口版本是1.4还是2.0呢?

如何判断HDMI接口版本是1.4还是2.0呢&#xff1f; HDMI是一种用于传输高质量音频和视频信号的接口标准。随着技术的不断发展&#xff0c;HDMI接口也经历了多次升级和改进。在市场上&#xff0c;常见的HDMI接口版本包括1.4和2.0。判断HDMI接口版本主要通过以下几种方法&#xff…...

【开发环境搭建篇】NodeJS的安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…...

【Docker】docker和docker-compose一键安装脚本(linux)

一、准备和运行脚本 当前脚本下载的docker和docker-compose兼容系统架构为x64&#xff0c;可以根据自己实际系统版本更改下载链接 1. 在控制台使用vim新建: vim install-docker.sh2. 复制内容并粘贴&#xff1a; #!/usr/bin/env bash # 设置脚本在遇到错误时终止执行 set -…...

在 Windows 中安装配置并启动运行 Jenkins【图文详细教程】

安装 Jenkins 的系统要求&#xff1a; 最少 256MB 可用内存最少 1GB 可用磁盘空间JDK 8 / 11 /17&#xff08;Jenkins 是用 Java 写的&#xff0c;打包成 war 包&#xff09; 查看 JDK 的版本 Java JDK 在 Windows 中安装可以参考&#xff1a;https://www.yuque.com/u27599042/…...

C# 读取txt文本所有行

引用&#xff1a;System.IO; Path.Combine(); //将字符串组合成一个路径 Path.GetFullPath(); //返回指定路径的绝对路径 File.ReadAllLines(); //读取文本框返回一个数组 File.ReadAllText(); //读取文本框返回一个字符串 File.ReadAllBytes(); //读取文本框返回字节 …...

STM32使用常见错误合集(正在更新版)

本文章记录一些学习STM32的一些错误问题&#xff0c;师承江科大哈哈哈 一、编译、烧录类问题 1、烧录不成功&#xff0c;Keil提示RDDI-DAP Error【场景&#xff1a;PWM驱动直流电机】 解决方案&#xff1a;将电机断开再进行烧录&#xff0c;断开后就可以美美烧录不报错啦~ …...

Java Random类

一、Random类 在项目开发中&#xff0c;经常需要使用随机数值&#xff0c;例如&#xff0c;网站登录中的验证码&#xff0c;或者需要以一定概率实现的某种效果&#xff08;如游戏程序中的物品掉落等&#xff09;&#xff0c;就需要Java提供的Random类&#xff0c;该类用于生成…...

【Spring Cloud】微服务通信概述

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;人生乏味啊&#xff0c;我欲令之光怪陆离 本文封面由 凯楠&#x1f4f7; 友情赞助播出 目录 前言 1. Dubbo&#xff08;Spring Cloud Alibaba&#xff09;和 Spring Cloud 的适…...

MySQL的概述与安装

一、数据库的基本概念&#xff1a; 1.1 数据&#xff1a; 1&#xff09; 描述事物的符号记录称为数据&#xff08;Data&#xff09;。数字、文字、图形、图像、声音、档案记录等 都是数据。 2&#xff09;数据是以“记录”的形式按照统一的格式进行存储的&#xff0c;而不是…...

《被讨厌的勇气》书摘2

发生什么不重要&#xff0c;怎样看待才重要 生活的真谛就是活在当下 来自他人和社会的评价&#xff0c;造成了我们的骄傲和自卑。人们经常借“爱”之名&#xff0c;行控制之实 学会课题分离 当我们发现自己的价值的时候&#xff0c;才具备了让自己真正自由和自主的勇气 人…...

基于SpringBoot的会员制医疗预约服务管理信息系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea 系统展示 系统功能模块 会员制医疗预约服务管…...

【二十三】【算法分析与设计】三柱汉诺塔详解,计算子移动次数,正常递归计算,观察数据得出数学规律,递归图得出数学规律,将递归函数转化为递推式

目录 汉诺塔递归 汉诺塔子移动次数的计算 牛牛的汉诺塔 选择正常的递归模拟计算子移动次数 根据具体数据得出数学规律 根据递归图得出数学规律 将递归函数转化为递推式 结尾 汉诺塔递归 汉诺塔是一个经典问题&#xff0c;相传在古印度圣庙中&#xff0c;有一种被称为汉…...

C# WPF编程-XAML

C# WPF编程-XAML XAML简述XAML子集XAML编译XAML基础XAML名称空间XAML中的属性和事件属性事件使用其他名称空间中的类型 加载和编译XAML XAML简述 XAML(Extensible Application Markup Language的简写&#xff0c;发音"zammel")是用于实例化.NET对象的标记语言。XAML…...

java 高级面试题(借鉴)(下)

雪花算法原理 第1位符号位固定为0&#xff0c;41位时间戳&#xff0c;10位workId&#xff0c;12位序列号&#xff0c;位数可以有不同实现。 优点&#xff1a;每个毫秒值包含的ID值很多&#xff0c;不够可以变动位数来增加&#xff0c;性能佳&#xff08;依赖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 开发篇:蓝图的使用

蓝图 引言一、为什么使用蓝图&#xff1f;二、蓝图的概念三、创建蓝图四、注册蓝图五、分享我的creat_app方法六、写在最后 引言 falsk是个轻量级的框架&#xff0c;核心实现简单&#xff0c;但同事可以让开发人员自由的扩展功能。开发中&#xff0c;使用模块导入的方式。 一…...

抖音视频爬虫下载软件|可导出视频分享链接|视频批量采集工具

无水印视频关键词批量下载工具操作指南 我们自主开发了一款便捷的音视频批量下载工具&#xff0c;不仅支持单个视频链接提取&#xff0c;还可通过关键词搜索实现批量采集和选择性下载&#xff0c;让您轻松获取所需视频内容。 操作说明&#xff1a; 关键词批量采集视频 进入软件…...

CentOS DHCP服务器部署指南

title: DHCP 服务器部署以及配置 search: 2024-03-21 tags: “#DHCP 服务器部署以及配置” CentOS DHCP 服务器部署指南 背景 &#xff1a;因上了 Linux 的实验课程&#xff0c;在课程中&#xff0c;老师要求我们自己搭建 DHCP 服务器构建局域网&#xff0c;在构建的时候问题百…...

llvm后端

SelectionDAGBuilder是LLVM&#xff08;Low Level Virtual Machine&#xff09;编译器中的一个重要组件&#xff0c;它负责将LLVM中间表示&#xff08;Intermediate Representation&#xff0c;IR&#xff09;转换为SelectionDAG&#xff08;选择有向无环图&#xff09;的形式。…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

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、运行以下命令卸载所有冲突的软件包&#xff1a; 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操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

基于PHP的连锁酒店管理系统

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

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;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)

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