Shell脚本流程控制语句CASE详解

news/2024/10/30 23:19:56/

本章节继续介绍流程控制语句,在前面的while语句,read语句生成了一些简单的菜单并构建了用户选择处理逻辑。使用了了一系列的if命令来识别可能的菜单选项。这种逻辑经常会出现在程序中,Shell提供了们处理多重选择的流程控制机制。


1.case命令

在Bash中,多重选择复合命令是case,用法如下:

case word in[parrern [| pattern]...) commands ;;]...
esac

使用case简化用户选择处理逻辑:

[sysadmin@ansible bin]$ cat case-menu
#!/bin/bash#case-menuclear
echo "
Please Select:1.Display System Information
2.Display Disk Space
3.Display Home Space Utilization
4.Quit
"
read -p "Enter selection [0-3] > "case "$REPLY" in0)      echo "Program terminated."exit;;1)      echo "Hostname: $HOSTNAME"uptime;;2)      df -h;;3)      if [[ "$(id -u)" -eq 0 ]]; thenecho "Home Space Utilization (ALL Users)"du -sh /home/*elseecho "Home Space Utilizaion ($USER)"du -sh "$HOME"fi;;*)      echo "Invalid entry." >&2exit 1;;
esac

case命令查看word的值,本例中就是REPLY的值,然后将其与patterns指定的模式匹配。如果找到匹配,则执行与该模式关联的命令,之后不再尝试进行其他匹配。

1.1 模式

case使用的模式与路径名扩展使用的模式一样,模式以)结尾。下表描述了case模式示例:

模式描述
a)如果word是a,则匹配
[[:alpha:]]如果word是单个字母,则匹配
???)如果word是3个字符,则匹配
*.txt)如果word是以.txt结尾,则匹配
*)不管word是什么内容,均可匹配。将该模式作为case命令最后一个模式是一种不错的做法,可以匹配之前的模式无法匹配到的内容,也就是说,能捕获到所有的“漏网之鱼”
[sysadmin@ansible bin]$ cat case-sample
#!/bin/bash# case-sampleread -p "enter word > "case "$REPLY" in[[:alpha:]])    echo ""$REPLY" is a single alphabetic character." ;;[ABC][0-9])             echo ""$REPLY" is A, B, or C followed by a digit." ;;???)                    echo ""$REPLY" is three characters long." ;;*.txt)                  echo ""$REPLY" is a word ending in '*.txt'" ;;*)                              echo ""$REPLY" is something else." ;;
esac

也可以使用|作为分隔符,将多个模式组合在一起,形成“逻辑或”(or)关系的条件模式,这在同时处理大小写字母的的时候很有用。

[sysadmin@ansible bin]$ cat case-menu
#!/bin/bash#case-menuclear
echo "
Please Select:B.Display System Information
C.Display Disk Space
D.Display Home Space Utilization
Q.Quit
"
read -p "Enter selection [0-3] > "case "$REPLY" inq|Q)    echo "Program terminated."exit;;b|B)    echo "Hostname: $HOSTNAME"uptime;;c|C)    df -h;;d|D)    if [[ "$(id -u)" -eq 0 ]]; thenecho "Home Space Utilization (ALL Users)"du -sh /home/*elseecho "Home Space Utilizaion ($USER)"du -sh "$HOME"fi;;*)              echo "Invalid entry." >&2exit 1;;
esac

1.2 执行多次操作

Bash之前,case只允许在成功的匹配分支上执行一次操作,操作结束后,case命令随之终止。来看一个字符匹配脚本:

[sysadmin@ansible bin]$ cat case-1
#!/bin/bash# case-1:测试一个字符read -n 1 -p "Type a character > "
echocase "$REPLY" in[[:upper:]])    echo "$REPLY is a upper case." ;;[[:lower:]])    echo "$REPLY is a lower case." ;;[[:alpha:]])    echo "$REPLY is a alphabetic." ;;[[:digit:]])    echo "$REPLY is a digit." ;;[[:graph:]])    echo "$REPLY is a visible character." ;;[[:punct:]])    echo "$REPLY is a punctuation symbol." ;;[[:space:]])    echo "$REPLY is a whitespace character." ;;[[:xdigit:]])   echo "$REPLY is a hexadecimal digit." ;;
esac

在Bash4.0之前,case无法匹配多个分支。现代版本的Bash添加了;;&语法,允许继续测试下一个模式,上一个代码改写为

[sysadmin@ansible bin]$ cat case-2
#!/bin/bash# case-2:测试多个字符read -n 1 -p "Type a character > "
echocase "$REPLY" in[[:upper:]])    echo "$REPLY is a upper case." ;;&[[:lower:]])    echo "$REPLY is a lower case." ;;&[[:alpha:]])    echo "$REPLY is a alphabetic." ;;&[[:digit:]])    echo "$REPLY is a digit." ;;&[[:graph:]])    echo "$REPLY is a visible character." ;;&[[:punct:]])    echo "$REPLY is a punctuation symbol." ;;&[[:space:]])    echo "$REPLY is a whitespace character." ;;&[[:xdigit:]])   echo "$REPLY is a hexadecimal digit." ;;&
esac
[sysadmin@ansible bin]$ case-2
Type a character > a
a is a lower case.
a is a alphabetic.
a is a visible character.
a is a hexadecimal digit.
[sysadmin@ansible bin]$

有了;;&,case就可以继续测试模式,而不再直接终止。case是处理某些特定类型问题的绝佳工具。


http://www.ppmy.cn/news/1096.html

相关文章

python接口自动化测试框架

本文总结分享介绍接口测试框架开发,环境使用python3selenium3unittestddtrequests测试框架及ddt数据驱动,采用Excel管理测试用例等集成测试数据功能,以及使用HTMLTestRunner来生成测试报告,目前有开源的poman、Jmeter等接口测试工…

[附源码]计算机毕业设计养生药膳推荐系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

redis我记不住的那些命令(五)

背景:我记不住那么多命令,又是Linux命令,又是Git命令,又是kubernetes的命令,又是maven命令,又是redis命令。所谓好记性不如烂笔头,记下来吧。 一、set集合 集合的特点是 无序且各不相同的元素…

Linux安装使用Minio

目录简介安装方式1(推荐)安装方式2使用简介 需要一个靠谱的文件管理系统,所以想到了minio。在此记录过程。使用树莓派搭建。Linux下载不同的包即可。 官网地址:https://www.minio.org.cn/ 官方下载地址:https://dl.min.io/server/minio/rele…

NNDL 实验七 循环神经网络(3)LSTM的记忆能力实验

文章目录6.3 LSTM的记忆能力实验6.3.1 模型构建6.3.1.1 LSTM层6.3.1.2 模型汇总6.3.2 模型训练6.3.2.1 训练指定长度的数字预测模型6.3.2.2 多组训练6.3.2.3 损失曲线展示【思考题1】LSTM与SRN实验结果对比,谈谈看法。(选做)6.3.3 模型评价6.…

【华为上机真题 2022】停车场车辆统计

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

一文了解 Go 接口

耐心和持久胜过激烈和狂热。 哈喽大家好,我是陈明勇,今天分享的知识是 Go 接口。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方&…

嵌入式Linux 开发经验:注册一个 misc 设备

前言 之前买过好几本Linux 设备驱动的书,不过对设备驱动一知半解,什么叫设备,什么又叫驱动?最近工作需要,从源码级别深入的研究了一下 Linux 下的设备与驱动的概念,略有所收获 一般提起驱动开发&#xff0…