shell case判断的实际应用

简介

  case语句是一种多路分支结构,用于根据变量的值来判断执行不同的命令。作用与 if 有着异曲同工之妙,在某些地方比 if 可能更加好用,这里就介绍一些 case 的用法与实践,if 的详细方法见另一篇文章:shell if判断的应用方法-CSDN博客

        

文章目录如下

1. case 的基本语法

2. 正则表达式的用法

2.1. 分隔符匹配

2.2. 通配符匹配

2.3. 范围匹配

3. 实际应用场景

3.1. 修改变量

3.2. 匹配IP长度

3.3. 读取交互的变量

3.4. 检查文件后缀


        

1. case 的基本语法

case [var] in    # var是需要判断的变量名,case in是固定的str1)        # 判读var变量是str1command1 # 如果变量是"str1",则执行这里的命令;;       # 固定结尾语法 str2)        # 判读var变量是str2command2 # 如果变量是"str2",则执行这里的命令;;       # 固定结尾语法 *)           # 如果变量既不是str1又不是str2,那么执行这里的命令command3 # 自定义命令;;       # 固定结尾语法
esac             # 固定case的结尾语法

case 语法的开头是 case 变量 in ,意思就是使用 case 语法读取某个变量,根据变量不同的结果执行不同的命令。

esac 是语法的结尾符,就是 case 倒过来写。

        

【例子】如果参数为1,调用函数Func1的方法;如果参数为2,调用函数Func2的方法;如果不是1或2,则调用函数Func3的方法。

# 封装3个函数
Func1(){echo "我是函数1"}
Func2(){echo "我是函数2"}
Func3(){echo "我是函数3"}# 使用case判断参数
case $1 in     # 判断位置参数1的结果1)         # 如果为1,执行下面的代码Func1;;2)         # 如果为2,执行下面的代码Func2;;*)         # 如果非1或2,执行下面的代码Func3;;
esac           # 结束语法

结果如下

  • 参数为1,执行函数1。
  • 参数为2,执行函数2。
  • 参数非1或2,执行函数3。

        

不论是位置参数还是变量,我们都可以使用这种方法判断

# 定义一个变量
var="A"# 判断这个变量
case ${var} inA)echo "变量为A";;*)echo "变量不为A";;
esac

        

也可以直接使用命令来做判断

# 判断命令的结果
case $(ls file.txt) infile.txt)echo "有file.txt这个文件";;*)echo "没有file.txt这个文件";;
esac

        

case 除了可以直接使用,也支持语句嵌套

# 定义2个变量
a=$1
b=$2# 判断变量a
case ${a} in1)# 如果a为1,判断bcase ${b} in2)echo "a=1, b=2";;*)echo "a=1, b!=2";;esac;;*)echo "a!=1";;
esac
  • 如果a为1,判断b
    • 如果b为2,执行xxx
    • 如果b不为2,执行xxx
  • 如果a不为1,执行xxx 

        

2. 正则表达式的用法

正则表达式能够将 case 的用法完全发挥,这里列举3种常用的方法。

2.1. 分隔符匹配

yes|YES|Yes)  # 使用 | 分割

基本语法在《目录1》已经介绍过,平时使用最多就是判断某个变量是否=xxx。这些变量可以自定义,也可以通过某些命令获取的值。当出现多个值时,那么使用固定的值判断就显得有些局限。需求如下:

  • 判断变量 var 是 yes 或 YES 或 Yes,执行 Func1
  • 判断变量 var 是 no 或 NO 或 No,执行 Func2
  • 如果既不是 yes,也不是 no,执行 Func3
# 定义一个变量
var="$1"# 封装3个函数
Func1(){echo "我是yes指定的函数1"}
Func2(){echo "我是no指定的函数2"}
Func3(){echo "我是非yes或no指定的函数3"}# 使用case判断参数
case ${var} inyes|YES|Yes) Func1;;no|NO|No)Func2;;*)Func3;;
esac

结果如下

        

2.2. 通配符匹配

字符*)  或者  *字符)  # *匹配0个或多个字符
字符?)  或者  ?字符)  # ?匹配1个字符

当获取的变量存在多个字符,但只能确定字符中包括xxx字符时,那么通配符的作用就展示出来了。需求如下:

  • 判断路径是否包含 file 路径
path=$(pwd)case ${path} in*/file*)echo "当前路径包含 file 目录";;*)echo "当前路径不包含 file 目录";;
esac

*/file* 表示 /file 左右可以出现任意字符。

*/file  表示 /file 左边可以出现任意字符。

/file*  表示 /file 右边可以出现任意字符。

        

除了常用的 * 符号,还有一个不常用的 ? 符号,来看一个例子

case $1 in"a"?)echo "位置参数为a+1个任意字符";;?"a")echo "位置参数为任意1个字符+a";;*)echo "位置参数为a或者其他";;
esac

使用 ? 符号挨着需要匹配的字符串旁边。以匹配字符 a 为例,表示匹配变量为2个字符。

  • a?:表示a后面接任意一个字符
  • ?a:表示a前面接任意一个字符

        

2.3. 范围匹配

  • 这里主要介绍 [ ] 符号:匹配一个范围字符,但 case 中貌似不支持 [字符]{次数}

【案例一】匹配一个大写字母 [A-Z]

case "$1" in[A-Z])echo "这是1个大写字母";;
esac

        

【案例二】匹配一个小写字母 [a-z]

case "$1" in[a-z])echo "这是1个小写字母";;
esac

        

【案例三】匹配一个数字 [0-9]

case "$1" in[0-9])echo "这是1个数字";;
esac

        

【案例四】匹配一个数字或字母(不包括特殊字符)[0-9] | [a-z] | [A-Z]

case "$1" in[0-9]|[a-z]|[A-Z])echo "这是1个数字或字母";;
esac

也可以这样写 [0-9a-zA-Z]

case "$1" in[0-9a-zA-Z])echo "这是1个数字或字母";;
esac

         

【案例五】匹配多个字母或多个数字 [0-9][0-9][0-9]

case "$1" in[0-9][0-9][0-9])echo "这是3个数字";;[a-z][a-z][a-z])echo "这是3个小写字母";;[A-Z][A-Z][A-Z])echo "这是3个大写字母";;
esac

case 中匹配多个字符只有使用多个 [ ][ ][ ] 的方法,[a-z]{次数} 这种方式在case中不支持。

        

【案例六】匹配以a开头的字符 a*

case "$1" ina*)echo "这是1个以a开头的字符";;
esac

        

【案例七】匹配以a结尾的字符 *a

case "$1" in*a)echo "这是1个以a结尾的字符";;
esac

        

3. 实际应用场景

3.1. 修改变量

需求如下:

  • 如果网卡名为 ens33,那么执行A方法
  • 如果网卡名为 ens192,那么执行B方法
  • 如果网卡名不是 ens33 或 ens192,那么修改原变量,执行C方法
# 读取某个值赋值给变量
var=$(ip route get 8.8.8.8 |awk -F ' src' 'NR==1{print $1}' |awk '{print $NF}')case ${var} in"ens33")echo "执行A方法";;"ens192")echo "执行B方法";;*)var="ens100"echo "var的值超过范围,重新定义后执行C方法";;
esac

        

3.2. 匹配IP长度

方法参考《2.3. 正则表达式匹配》,需求如下:

  • IP以192开头
  • IP中间每段数字都是3个
case "$1" in192.[0-9][0-9][0-9].[0-9][0-9][0-9].[0-9][0-9][0-9])echo "这是1个以192开头,全3位的IP";;*)echo "IP不正确";;
esac

        

3.3. 读取交互的变量

需求如下:

  • 用户传入 yes 或 YES 或 y 或 Y 表示删除某个文件
  • 用户传入 no 或 NO 或 n 或 N 表示不删除某个文件
  • 用户传入其他参数需给出提示:重新传入
while read -p "是否删除文件file1.txt: " r;docase ${r} inyes|YES|y|Y)echo "删除文件file1.txt后退出"rm -rf file1.txtbreak;;no|NO|n|N)echo "不删除文件file1.txt,直接退出"break;;esac
done

结果如下

        

3.4. 检查文件后缀

需求如下:

  • 文件如果是文本文件,执行xxx
  • 文件如果是图片文件,执行xxx
  • 文件即不是文本文件,又不是图片文件,执行xxx
case "$1" in*.txt)echo "这是一个文本文件,执行xxx";;*.jpg | *.png)echo "这是一个图片文件,执行xxx";;*)echo "该文件不符合需求,执行xxx";;
esac

        

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

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

相关文章

我的机器学习起步如何Getting Started

学习技巧和原则 先通过经典书籍进行科普知名机器学习网站根据书籍或网站的目录,先泛读、再选择有兴趣的部分重点精读、后至于反复读知行合一 起步Getting Started 周志华版《机器学习》,又名西瓜书 可以作为科普书籍,需要主动略过对于理论…

27、web攻防——通用漏洞SQL注入Tamper脚本Base64Jsonmd5

文章目录 数字型:0-9。http;//localhost:8081/blog/news.php?id1 字符型:a-z、中文,需要闭合符号。http;//localhost:8081/blog/news.php?idsimple 搜索型:在字符型的基础上加入了通配符%。http;//localhost:8081/blog/news.…

问界M9激光雷达解说

什么是激光雷达 激光雷达(英文:Lidar),是一种通过发射激光束来测量目标位置、速度等特征量的雷达系统。其工作原理是将激光光束照射到目标物体上,然后通过测量激光光束从发射到反射回来的时间,来计算目标物体的距离、位置、速度等参数。激光雷达通常用于测量地形、地貌、…

js常用事件演示

为什么要使用js事件: JavaScript事件是非常重要的,因为它们提供了与用户交互和处理用户操作的能力。以下是一些使用JavaScript事件的原因: 交互性:使用JavaScript事件可以实现各种交互功能,例如点击按钮、移动鼠标、按…

考研用什么光源比较好?五款好用台灯推荐

人眼对光是非常敏感的,特别是儿童青少年眼睛还在发育的状态来说,光线是至关重要的,于是这次测评就不能马虎,必须要本着专业严谨的态度进行测评,这次测评呢就花了不少钱买下了现在市面上热度很高、或是较有名气的专业款…

LeetCode刷题--- 第 N 个泰波那契数

个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言:这个专栏主要讲述动…

算法通关村第二十关-黄金挑战图的常见算法

大家好我是苏麟 , 今天聊聊图的常见算法 . 图里的算法是很多的,这里我们介绍一些常见的图算法。这些算法一般都比较复杂,我们这里介绍这些算法的基本含义,适合面试的时候装*,如果手写,那就不用啦。 图分析算法&#xf…

【软件体系结构】软件体系结构风格

5.1 软件体系结构风格概述 多年来,人们在开发某些类型软件过程中积累起来的组织规则和结构,形成了软件体系结构风格。 软件体系结构风格,是总结人们设计经验而形成结构较为巩固、组织较为统一的形式,是一种适合于多种场合的相似…

uni-app设置地图显示

使用前需到**高德开放平台(https://lbs.amap.com/)**创建应用并申请Key 登录 高德开放平台,进入“控制台”,如果没有注册账号请先根据页面提示注册账号 打开 “应用管理” -> “我的应用”页面,点击“创建新应用”&…

poi操作Excel给列设置下拉菜单(数据验证)

效果图&#xff1a; pom.xml文件增加依赖&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version></dependency> 12345Workbook实现类有三个&#xff1a;HSSFWork…

JavaWeb三层架构

分层的目的是为了解耦。解耦就是为了降低代码的耦合度。方便项目后期的维护和升级。 JavaWeb应用程序的架构是一个关键的设计决策&#xff0c;而三层架构&#xff08;MVC模式&#xff09;是一种常见且有效的设计模式&#xff0c;能够清晰地分离不同部分的责任。让我们来深入了…

JavaWeb——前端之HTMLCSS

学习视频链接&#xff1a;https://www.bilibili.com/video/BV1m84y1w7Tb/?spm_id_from333.999.0.0 一、Web开发 1. 概述 能通过浏览器访问的网站 2. Web网站的开发模式——主流是前后端分离 二、前端Web开发 1. 初识 前端编写的代码通过浏览器进行解析和渲染得到我们看到…

Redis源码——压缩列表

压缩列表ziplist本质上就是一个字节数组&#xff0c;是Redis为了节约内存而设计的一种线性数据结构&#xff0c;可以包含多个元素&#xff0c;每个元素可以是一个字节数组或一个整数。Redis的有序集合、散列和列表都直接或者间接使用了压缩列表。当有序集合或散列表的元素个数比…

项目经验简单总结

引擎 unity 2020 语言 C# lua python(用于工具链) java (用于SDK对接) js&#xff08;PC WEB SDK对接&#xff09; 编辑器 VS VSCODE IDEA eclipse 项目开发模块规划分 主项目工程&#xff0c;UI资源项目工程&#xff0c;模型场景资源项目工程 主项目工程&#xff1a;所有的…

qt图像绘制QPainter

QPainter 以下是一些常用的 Qt::PenStyle 枚举值&#xff1a; Qt::NoPen&#xff1a;无线条。Qt::SolidLine&#xff1a;实线。Qt::DashLine&#xff1a;虚线&#xff0c;由短划线组成。Qt::DotLine&#xff1a;点线&#xff0c;由点组成。Qt::DashDotLine&#xff1a;点划线&…

炫酷鼠标悬停随机渐变文本动画效果

如图所示&#xff0c;这是一个很炫酷的鼠标悬停动画效果&#xff0c;卡片的文字随着鼠标的移动不断变化着&#xff0c;且文字的颜色伴随着渐变色跟随鼠标移动&#xff0c;中心部分是突出的LOGO效果&#xff0c;整个交互效果十分引人注目。原效果来源于 evervault.com/customers…

Head First Design Patterns - 装饰者模式

什么是装饰者模式 装饰者模式动态地将额外责任附加到对象上。对于拓展功能&#xff0c;装饰者提供子类化的弹性替代方案。 --《Head First Design Patterns》中的定义 为什么会有装饰者模式 根据上述定义&#xff0c;简单来说&#xff0c;装饰者模式就是对原有的类&#xff0c…

绝地求生:PUBG到底怎么穿?

闲游盒突然就认为这条裤子很不错&#xff0c;褶皱设计&#xff0c;版型&#xff0c;和其他饰品的搭配能力方面&#xff0c;私以为比柏林裤和悲喜白色长裤的可搭配能力要强一些。可能是因为看起来更日常化&#xff0c;在我进行尝试后发现柏林裤版型在穿鞋的时候会露出脚脖子&…

目标检测-Owo Stage-YOLOv2

文章目录 前言一、YOLOv2的网络结构和流程二、YOLOv2的创新点预处理网络结构训练 总结 前言 根据前文目标检测-One Stage-YOLOv1可以看出YOLOv1的主要缺点是&#xff1a; 和Fast-CNN相比&#xff0c;速度快&#xff0c;但精度下降。&#xff08;边框回归不加限制&#xff09;…

2023年最新版的linux运维面试题(四)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 写在前面 大家好&#xff0c;我是网络豆&#xff0…