热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在Bash脚本中使用Case语句

Bashcase语句功能强大且易于编写。当您重新访问旧的Linux脚本时,您会很高兴使用了case语句而不是长if-then-else语句。案例陈述大多数编程语言

Bash case 语句功能强大且易于编写。当您重新访问旧的 Linux 脚本时,您会很高兴使用了case语句而不是长if-then-else语句。

案例陈述

大多数编程语言都有自己的 a switchorcase语句版本。它们根据变量的值指导程序执行的流程。通常,为变量的每个预期可能值定义了一个执行分支,并 为所有其他值定义了一个包罗万象或 默认分支。

逻辑功能类似于一长串if-then语句,其中一个else语句捕获之前未由其中一个if语句处理的所有内容。

执行case 尝试匹配的 表达式 与子句之一。它通过依次查看每个子句来尝试找到匹配的模式来做到这一点。子句中的模式是字符串,但是——与直觉相反——这并不意味着我们不能使用数值作为表达式。

一般情况

case语句的一般形式是这样的:

case expression in pattern-1)statement ;;pattern-2) statement;;...pattern-N) statement ;;*) statement ;;
esac

一个case语句必须与开始case的关键字和结束与esac关键字。

表达式被评估并与每个子句中的模式进行比较, 直到找到匹配项。

匹配子句中的一个或多个语句被执行。

双分号“ ;;”用于终止子句。

如果匹配模式并且执行了该子句中的语句,则忽略所有其他模式。

条款的数量没有限制。

星号“ *”表示默认模式。如果表达式与case语句中的任何其他模式不匹配,则执行 default 子句。

一个简单的例子

这个脚本告诉我们一个虚构商店的营业时间。它使用date带有+"%a"格式字符串的命令来获取缩短的日期名称。这存储在DayName变量中。

#!/bin/bashDayName=$(date +"%a")echo "Opening hours for $DayName"case $DayName inMon)echo "09:00 - 17:30";;Tue)echo "09:00 - 17:30";;Wed)echo "09:00 - 12:30";;Thu)echo "09:00 - 17:30";;Fri)echo "09:00 - 16:00";;Sat)echo "09:30 - 16:00";;Sun)echo "Closed all day";;*);;
esac

将该文本复制到编辑器中,并将其另存为名为“open.sh”的文件。

我们需要使用该chmod命令使其可执行。在阅读本文时,您需要对创建的所有脚本执行此操作。

chmod +x open.sh

我们现在可以运行我们的脚本。

./open.sh

截取屏幕截图的那天恰好是星期五。这意味着该DayName 变量包含字符串“Fri”。这与“Fri)”子句的“Fri”模式相匹配。

请注意,子句中的模式不需要用双引号括起来,但如果用双引号括起来也无妨。但是,如果模式包含空格,则必须使用双引号。

默认条款已留空。任何与前述条款之一不匹配的内容都将被忽略。

该脚本有效且易于阅读,但它冗长且重复。我们可以case 很容易地缩短这种类型的 语句。

在一个子句中使用多个模式

case语句的一个非常巧妙的特性是您可以在每个子句中使用多个模式。如果表达式匹配这些模式中的任何一个,则执行该子句中的语句。

这是一个脚本,它告诉您一个月有多少天。只能有三个答案:2 月是 30 天、31 天或 28 天或 29 天。所以,虽然有 12 个月,但我们只需要三个条款。

在此脚本中,系统会提示用户输入月份的名称。为了使模式匹配不区分大小写,我们使用shopt带有-s nocasematch选项的命令。输入是否包含大写、小写或两者的混合都没有关系。

#!/bin/bashshopt -s nocasematchecho "Enter name of a month"
read monthcase $month inFebruary)echo "28/29 days in $month";;April | June | September | November)echo "30 days in $month";;January | March | May | July | August | October | December)echo "31 days in $month";;*)echo "Unknown month: $month";;
esac

二月有一个属于自己的条款,所有其他月份根据它们是否有 30 天或 31 天共享两个条款。多模式子句使用管道符号“|” 作为分隔符。默认情况下捕获拼写错误的月份。

我们将其保存到名为“month.sh”的文件中,并使其可执行。

chmod +x month.sh

我们将多次运行脚本并表明使用大写或小写都没有关系。

./month.sh

因为我们告诉脚本忽略大写和小写的差异,所以任何拼写正确的月份名称都由三个主要子句之一处理。默认条款会捕获拼写错误的月份。

在 case 语句中使用数字

我们也可以使用数字或数值变量作为表达式。此脚本要求用户输入 1…3 范围内的数字。为了清楚表明每个子句中的模式都是字符串,它们被用双引号括起来。尽管如此,脚本仍然将用户的输入与适当的子句匹配。

#!/bin/bashecho "Enter 1, 2, or 3: "
read Numbercase $Number in"1")echo "Clause 1 matched";;"2")echo "Clause 2 matched";;"3")echo "Clause 3 matched";;*)echo "Default clause matched";;
esac

将其保存到名为“number.sh”的文件中,使其可执行,然后运行它:

./number.sh

在 for 循环中使用 case 语句

甲case语句试图图案匹配单个表达式。如果你有很多表达式要处理,你可以把case语句放在一个for循环中。

这个脚本执行的ls命令来获得文件的列表。在for循环中,文件通配(与正则表达式类似但不同)依次应用于每个文件以提取文件扩展名。这存储在Extension字符串变量中。

该case语句使用Extension变量作为它试图与子句匹配的表达式。

#!/bin/bashfor File in $(ls)do# extract the file extensionExtension=${File##*.}case "$Extension" insh)echo " Shell script: $File";;md)echo " Markdown file: $File";;png)echo "PNG image file: $File";;*)echo "Unknown: $File";;esac
done

将此文本保存到名为“filetype.sh”的文件中,使其可执行,然后使用以下命令运行它:

./filetype.sh

我们的极简文件类型识别脚本有效。

使用 case 语句处理退出代码

一个行为良好的程序会在它终止时向 shell 发送一个退出代码。传统方案使用零退出代码值来指示无问题执行,使用一个或多个值来指示不同类型的错误。

许多程序只使用零和一。将所有错误条件集中到一个单一的退出代码中会使识别问题变得更加困难,但这是常见的做法。

我们创建了一个名为“go-geek”的小程序,它会随机返回零或一的退出代码。下一个脚本调用go-geek. 它使用$?shell 变量获取退出代码,并将其用作case语句的表达式。

真实世界的脚本会根据生成退出代码的命令的成功或失败进行适当的处理。

#!/bin/bashgo-geekcase $? in"0")echo "Response was: Success"echo "Do appropriate processing in here";;"1")echo "Response was: Error"echo "Do appropriate error handling in here";;*)echo "Unrecognised response: $?";;
esac

将其保存到名为“return-code.sh”的脚本中并使其可执行。你需要用一些其他的命令来代替我们的go-geek命令。您可以尝试cd进入一个不存在的目录以获得 1 的退出代码,然后将您的脚本编辑cd到一个可访问的目录以获得 0 的退出代码。

多次运行脚本会显示case语句正确识别的不同退出代码。

./return-code.sh

易读性有助于可维护性

回到旧的 Bash 脚本并弄清楚它们如何做它们所做的事情,特别是如果它们是由其他人编写的,是具有挑战性的。修改旧脚本的功能更加困难。

该case语句为您提供了具有清晰和简单语法的分支逻辑。这是双赢。


推荐阅读
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
author-avatar
糖糖菓子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有