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 变量 in
    	start)
    			执行的代码
    			;;
    	stop)
    			执行的代码
    			;;	
    	restart)
    			执行的代码
    			;;
    	
      *)
      		echo "Usage: $0 [ start | stop | restart ]"
    esac
    

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

#!/bin/bash

cat <<eof
****************
** 1. backup  **
** 2. copy    **
** 3. quit    **
****************
eof

read -p "输入你选择的编号:" action

case $action in
	1|backup) #使用竖线|可以匹配1或者backup,也就是可以用竖线来匹配多个值。
		echo "backup..."
		;; #双封号记得要加
	2|copy)
		echo "copy..."
		;;
	3)
		exit
		;;
	*) #没有匹配到任何值,则执行“*)”后面的指令
		echo "Usage: $0 [ 1 | 2 | 3 ]"
		exit
esac

案例2:

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

#!/bin/bash

source /etc/init.d/functions

case $1 in
	start)
		ngx_status=$(pidof nginx |wc -l)
		if [ $ngx_status -eq 1 ];then #如果返回1,说明有nginx进程,就无需再次启动
			action "nginx is starting" /bin/false
		else
			systemctl start nginx
			action "nginx is starting" /bin/true
		fi
		;;
	stop)
		pkill nginx
		if [ $? -eq 0 ];then
			action "nginx is stoped" /bin/true
		else
			action "nginx is stoped" /bin/false
		fi
		;;
	restart)
		pkill nginx && systemctl start nginx
		if [ $? -eq 0 ];then
			action "nginx is restart" /bin/true
		else
			action "nginx is restart" /bin/false
		fi
		;;

	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/bash

read -p "输入要查看的状态指标: [ active_conn | accepts | handled | requests | reading | writing | waiting ]" action

case $action in
	 active_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结尾的都走这个location
		fastcgi_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/bash

read -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 ]:" action

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

脚本执行效果:

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


案例6:

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

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

在这里插入图片描述

#!/bin/bash

if [ $USER != "root" ];then
        echo "$USER 对脚本 $0 没有执行权限!"
        exit
fi

if [ $# -ne 1 ];then
        echo "使用脚本 $0 时只能传递一个参数"
        exit
fi

systemctl status $1 &>/dev/null
rc=$?
if [ $rc -eq 4 ];then
        echo "服务 $1 不存在"
        exit

elif [ $rc -eq 0 ];then
        read -p "当前 $1 处于启动状态是否需要[ stop | restart ]" action
        case $action in
                stop)
                        systemctl stop $1
                        ;;
                restart)
                        systemctl restart $1
                        ;;
                *)
                        echo "请输入[ stop | restart]"
                        exit
                        ;;
        esac
elif [ $rc -eq 3 ];then
        read -p "当前 $1 处于停止状态是否需要[ start |quit ]" action1
        case $action1 in
                start)
                        systemctl start $1 &>/dev/null
                        if [ $? -eq 0 ];then
                                echo "启动成功!"
                        else
                                read -p "服务 $1 启动失败,是否尝试修复[ repair|quit ]" action2
                                case $action2 in
                                        repair)
                                                nginx -t &> ngx.tmp
                                                ngx_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 "输入有误!再见"
                                                ;;
                                esac
                        fi

                        ;;
                quit)
                        exit
                        ;;
                *)
                        echo "请输入[ start | quit]"
                        exit
                        ;;
        esac
fi

脚本执行效果:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3 报错 require is not defined

问题 require is not defined 原因 vite 不支持require的用法&#xff0c; webpack是支持的 解决 方法一&#xff1a; 更改vite使用语法 vite官网 方法二 安装转换插件vite-plugin-require-transform 仓库地址 参考 关于Vite不能使用require问题 方法二Vite 踩坑 —— …

html5cssjs代码 036 CSS默认值

html5&css&js代码 036 CSS默认值 一、代码二、解释 CSS默认值&#xff08;也称为浏览器默认样式&#xff09;是指当HTML元素没有应用任何外部CSS样式时&#xff0c;浏览器自动为这些元素赋予的一组基本样式。这些样式是由浏览器的默认样式表&#xff08;User Agent sty…

【Godot4.2】实现鼠标控制对象(控件)旋转

概述 在一些情况下我们可能需要使用鼠标控制对一个图形或对象&#xff08;如控件&#xff09;进行旋转。 通过如下图的分析&#xff1a; 我们可以知道&#xff1a; 我们只需要求出对象&#xff08;如控件&#xff09;中心点C到鼠标点击的位置start的向量与中心点C到鼠标移动…

STM32最小核心板使用HAL库实现CAN接口通讯(轮询方式)

这里使用了CAN1的接口&#xff0c;具体使用MX创建项目就不放了 需要注意的是&#xff0c;由于是最小核心没有CAN的收发模块需要外接一个 STM32核心板接CAN收发模块不需要交叉 /**CAN GPIO ConfigurationPA11 ------> CAN_RXPA12 ------> CAN_TX */ CAN收发模块…

力扣454. 四数相加 II

思路&#xff1a;把四个数组拆成两对&#xff0c;两个分别相加&#xff0c;记录第一对的相加结果进map里&#xff0c;再把第二对数组 0-nums2-nums4 去map里面找出现了几次&#xff0c;这题不用对重复的四元组去重&#xff0c;所以出现多次都有效。 class Solution {public int…

[flask] flask的基本介绍、flask快速搭建项目并运行

笔记 Flask Flask 本身相当于一个内核&#xff0c;其他几乎所有的功能都要用到扩展&#xff08;邮件扩展Flask-Mail&#xff0c;用户认证Flask-Login&#xff0c;数据库Flask-SQLAlchemy&#xff09;&#xff0c;都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、…

ubuntu20.04搭建nginx rtmp视频服务到指定位置解决权限不足

1.安装依赖 apt-get install build-essential libpcre3 libpcre3-dev libssl-dev2.建一个目录 mldir rtmp_nginx 3.源码下载 wget http://nginx.org/download/nginx-1.21.6.tar.gz wget https://github.com/arut/nginx-rtmp-module/archive/master.zip4.解压缩 tar -xf ng…

新能源汽车充电桩站点烟火AI识别检测算法应用方案

新能源汽车作为现代科技与环保理念的完美结合&#xff0c;其普及和应用本应带给人们更加便捷和绿色的出行体验。然而&#xff0c;近年来新能源汽车充电火灾事故的频发&#xff0c;无疑给这一领域投下了巨大的阴影。这不禁让人深思&#xff0c;为何这一先进的交通工具在充电过程…

计算机服务器中了faust勒索病毒怎么办,faust勒索病毒解密工具流程

网络是一把利剑&#xff0c;可以方便企业开展各项工作业务&#xff0c;为企业提供极大的便利&#xff0c;但随着网络技术的不断发展与应用&#xff0c;网络数据安全威胁也在不断增加&#xff0c;给企业的正常生产运营带来了极大困扰&#xff0c;近日&#xff0c;云天数据恢复中…

AJAX-Promise

定义 Promise对象用于表示(管理)一个异步操作的最终完成&#xff08;或失败&#xff09;及其结果值。 好处&#xff1a;1&#xff09;成功和失败状态&#xff0c;可以关联对应处理程序 2&#xff09;了解axios函数内部运作机制 3&#xff09;能解决回调函数地狱问题 语法&…

七仔充电桩平台 二轮电动自行车 四轮汽车 云快充1.5 云快充1.6

文章目录 一、产品功能部分截图1.手机端&#xff08;小程序、安卓、ios&#xff09;2.PC端 二、小程序体验账号以及PC后台体验账号1.小程序体验账号2.PC后台体验账号关注公众号获取最新资讯 三、产品简介&#xff1f;1. 充电桩云平台&#xff08;含硬件充电桩&#xff09;&…

ORACLE查询拼接字段,显示clob原因,及解决办法

今天查询一个字段&#xff0c;使用了拼接&#xff0c;然后查出来就显示clob&#xff1a; 代码如下&#xff1a; SELECT LOAD_DATE, CINO, WM_CONCAT(CITYP) AS CITYPFROM ODS.ZN_CUSTCITYP GROUP BY CINO,LOAD_DATE 显示如图&#xff1a; 解决办法&#xff1a; select t.普…

Java-SSM医院在线预约系统

Java-SSM医院在线预约系统 1.服务承诺&#xff1a; 包安装运行&#xff0c;如有需要欢迎联系&#xff08;VX:yuanchengruanjian&#xff09;。 2.项目所用框架: 前端:JSP、layui等。 后端:SSM,即Spring、SpringMvc、Mybatis等。 3.项目功能点: 1.管理员功能: a.修改个人信息…

[ Django ] 统计接口访问频次

需求及实现思路 需求&#xff1a;统计django项目中接口的调用次数 思路&#xff1a;中间件异步任务celery缓存redis/直接使用中间件&#xff08;会增加中间件的压力&#xff09; 具体思路&#xff1a; 定义中间件&#xff0c;在中间件中响应走的时候判断该请求的url是否存在…

【吾爱破解】Android初级题(二)的解题思路 _

拿到apk&#xff0c;我们模拟器打开看一下 好好&#xff0c;抽卡模拟器是吧&#x1f600; jadx反编译看一下源码 找到生成flag的地方&#xff0c;大概逻辑就是 java signatureArr getPackageManager().getPackageInfo(getPackageName(), 64).signaturesfor (int i 0; i &l…

综合知识篇15-开发管理考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

C# 读取二维数组集合输出到Word预设表格

目录 应用场景 设计约定 范例运行环境 配置Office DCOM 实现代码 组件库引入 核心代码 DataSet转二维数组 导出写入WORD表格 调用举例 小结 应用场景 存储或导出个人WORD版简历是招聘应用系统中的常用功能&#xff0c;我们通常会通过应用系统采集用户的个人简历信息…

01、Lua 入门教程

Lua 入门教程 Lua是一种轻量小巧的脚本语言&#xff0c;用标准C语言编写并以源代码形式开放&#xff0c; 其设计目的是为了嵌入应用程序中&#xff0c;从而为应用程序提供灵活的扩展和定制功能。 Lua是巴西里约热内卢天主教大学&#xff08;Pontifical Catholic University of…

使用uni-app框架进行移动端的适配(uniapp px转rpx)

1、打开uniapp 官网找到 插件市场介绍2、点击插件市场 px2rpx - DCloud 插件市场3、选择使用HBuilderX导入插件4、在HBuilder中点击右键选择开启px2rpx 5、开启成功后会有提示 6、根据设计搞的尺寸就行&#xff0c;我的是在这750*1620的&#xff0c;正常写px&#xff0c;保存…

ES6中的Set集合

Set集合 ES6 提供了新的数据结构Set(集合)。 它类似于数组&#xff0c;但成员的值都是唯一的集合实现了 iterator 接口&#xff0c;所以可以使用「扩展运算符」和[for…of…」进行遍历集合的属性和方法 集合的属性和方法&#xff1a; 1&#xff09;size&#xff0c;返回集合的元…