6.shell case控制语句

news2024/9/22 5:40:57

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

脚本执行效果:

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

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

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

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

相关文章

大创项目推荐 协同过滤电影推荐系统

文章目录 1 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤4 4 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程 4.4 系统功能设计 …

六面体单元热应力问题有限元求解 | Matlab源码 | 理论文本 | 温度应力 | 热应变 |温度应变 |热力耦合

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

数字化转型导师坚鹏:数字化人才培养—企业数字化转型的核心力量

数字化人才培养&#xff1a;企业数字化转型的核心力量 ——数字化转型背景下重塑企业干部核心竞争力 授课背景&#xff1a; 很多银行存在以下问题&#xff1a; 企业干部不清楚企业需要哪些数字化人才&#xff1f; 企业干部不知道设计数字化人才培养方案&#xff1f; 企…

南京观海微电子---初识PCIe协议——PCIe接口专栏(一)

2. 概述 PCIe协议是一种端对端的互连协议&#xff0c;提供了高速传输带宽的解决方案。与传统的并行总线标准如PCI和PCI-X相比&#xff0c;PCIe提供了更低的延迟和更高的数据传输速率。每个连接到主板上的设备都通过独立的点对点连接与之相连&#xff0c;这避免了设备之间因为共…

桌面显示器PD芯片:引领桌面显示技术的新篇章

随着科技的飞速发展&#xff0c;桌面显示器作为人们日常工作与生活中不可或缺的重要设备&#xff0c;其性能与品质也在不断提升。其中&#xff0c;PD芯片作为桌面显示器中的核心组件&#xff0c;发挥着至关重要的作用。本文将对桌面显示器PD芯片进行详细介绍&#xff0c;探讨其…

Xinstall让App推广变得高效而简单

随着移动互联网的迅猛发展&#xff0c;App已成为人们生活中不可或缺的一部分。然而&#xff0c;对于众多开发者和广告主来说&#xff0c;如何高效地推广自己的App&#xff0c;却一直是一个令人头疼的问题。今天&#xff0c;我们要为大家介绍的&#xff0c;正是国内专业的App全渠…

ngrok实现内网穿透

在使用jenkins进行自动化部署时&#xff0c;需要设置github的webhook钩子来触发构建&#xff0c;由于jenkins运行在自己的电脑上&#xff0c;因此需要通过内网穿透来接受http请求。 Install ngrok via Homebrew with the following command: brew install ngrok/ngrok/ngrokP…

Wireshark 抓包工具与长ping工具pinginfoview使用,安装包

一、Wireshark使用 打开软件&#xff0c;选择以太网 1、时间设置时间显示格式 这个时间戳不易直观&#xff0c;我们修改 2、抓包使用的命令 1&#xff09;IP地址过滤 ip.addr192.168.1.114 //筛选出源IP或者目的IP地址是192.168.1.114的全部数据包。 ip.sr…

银河麒麟系统安装设备类型选择lvm简单模式之后,数据写入导致失败导致系统重启无法正常加载

银河麒麟系统安装设备类型选择lvm简单模式之后&#xff0c;数据写入导致失败导致系统重启无法正常加载 一 系统环境1.1 系统版本信息1.2 通过镜像安装的过程中选择设备类型选择的是lvm简单模式 二 问题描述三 问题修复过程3.1 挂载ISO镜像&#xff0c;引导到字符终端界面3.2 修…

如何注册 onlyFans? onlyFans 如何订阅教程

一、onlyFans 介绍 OnlyFans 是一个在线平台&#xff0c;允许创作者为他们的内容提供订阅服务&#xff0c;通常是成人内容或独家内容。该平台于2016年成立&#xff0c;起初被认为是一个用于演员、模特、艺术家和其他创意行业从业者分享内容的地方。随着时间的推移&#xff0c;O…

骑砍战团MOD开发(49)-使用ScoEditor编辑sco文件制作游戏场景

一.ScoEditor下载霸王•吕布 / ScoEditor GitCodehttps://gitcode.net/qq_35829452/scoeditor二.ScoEditor导出文件种类 mission_objects.json:场景物/出生点/通道等物体 layer_ground_elevation.pfm:场景terrain/ground地形增量,采用PFM深度图存储 ai_mesh.obj:AI网格静态模型…

二、SpringBoot3 配置文件

本章概要 统一配置管理概述属性配置文件使用YAML 配置文件使用批量配置文件注入多环境配置和使用 2.1 统一配置管理概述 SpringBoot工程下&#xff0c;进行统一的配置管理&#xff0c;你想设置的任何参数&#xff08;端口号、项目根路径、数据库连接信息等等)都集中到一个固定…

Echarts地图之——如何给省份名称添加背景图片背景色

上次添加的背景是给整张地图添加的&#xff0c;如果想要给省份名称设置背景图&#xff0c;我们就要在label配置里面去添加设置。 series: [ {type: map,map: china,aspectScale: 0.85,zoom: 1.2,top: 9%,left: 11%,roam: false,selectedMode: multiple,label: {show: true,col…

基于springboot的服装商城系统(含源文件)

&#xff08;源码附文章底部&#xff09; 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;时装购物系统当然也不能排除在外。时装购物系统是以实际运用为开发背景&#…

C++关键字:const

文章目录 一、const的四大作用1.修饰 变量、数组2.修饰 函数的形参、修饰 引用 (最常用&#xff09;3.修饰 指针&#xff1a;常量指针、指针常量 、只读指针4.修饰 类的成员函数、修饰 类的对象 一、const的四大作用 1.修饰 变量、数组 1.const修饰变量&#xff1a; 被const修…

牛客周赛 Round 37 E.魔法之森的蘑菇

广搜板子&#xff0c;加个方向就好了 注意多测清空问题 #include<bits/stdc.h> using namespace std; using ll long long; #define int long long const int N 1e510; const int inf 0x3f3f3f3f; const int mod 1e97;int n,m; char g[1010][1010]; bool vis[1010][1…

思科网络中DHCP协议的配置

一、什么是DHCP&#xff1f;DHCP有什么作用&#xff1f; &#xff08;1&#xff09;DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种网络协议&#xff0c;用于在局域网中自动分配IP地址和其他网络配置信息给计算机设备。我们电脑连接WiFi的时一般就是…

CCF-CSP认证考试 202305-3 解压缩 100分题解

更多 CSP 认证考试题目题解可以前往&#xff1a;CSP-CCF 认证考试真题题解 原题链接&#xff1a; 202305-3 解压缩 时间限制&#xff1a; 5.0s 内存限制&#xff1a; 512.0MB 题目背景 西西艾弗岛运营公司是一家负责维护和运营岛上基础设施的大型企业。在公司内&#xff0c;…

戳-考察C++基础的两道小题

昨天分享了一天本来是考察unique_ptr禁止拷贝行为的&#xff0c;但是粘贴的时候贴成正确代码了&#xff0c;于是&#xff0c;今天继续找两道小题来练练手。 今天这两道小题&#xff0c;你能回答上来不&#xff0c;题目1有至少6处错误&#xff0c;你能找到几个&#xff1f;题目2…

旅游小程序开发的费用及功能

随着科技的发展和智能手机的普及&#xff0c;越来越多的行业开始利用小程序来进行线上服务。旅游业作为一个重要的服务业&#xff0c;也纷纷推出了自己的旅游小程序&#xff0c;以方便游客在线预订、查询景点信息等。那么&#xff0c;旅游小程序开发的费用是多少&#xff1f;功…