- Linux Shell核心编程指南
- 丁明一
- 583字
- 2020-08-27 19:49:53
2.11 实战案例:简单、高效的case语句
Shell脚本中除了可以使用if...then...else...fi语句,还提供了一种书写更简单、可读性更好的case语句,case语句可以将某个关键词与预设的一系列值进行模式匹配。
case语句的格式如下。
case word in 模式1) 命令序列1; ; 模式2) 命令序列2; ; ...... *) 命令序列n; ; esac
case语句还支持多个条件的匹配,语法格式如下。
case word in 模式1|模式2|模式3) 命令序列1; ; 模式4|模式5|模式6) 命令序列2; ; ... ... *) 命令序列n; ; esac
上面的语法中,case命令首先会展开word关键字,然后将该关键字与下面的每个模式进行匹配比较。word关键字展开支持使用~(根目录)、变量展开$、算术运算展开$[]、命令展开$()等。每个模式匹配中也都支持与word关键字一样的展开功能。一旦case命令发现有匹配的模式,则执行对应命令序列中的命令。如果命令序列的最后使用了;;(双分号),则case命令不再对后续的模式进行匹配比较,即匹配停止。如果使用;&替代;;会导致case继续执行下一个模式匹配中附加的命令序列。如果使用;; &替代;;则会导致case继续对下一个模式进行匹配,如果匹配则执行对应命令序列中的命令。下面通过几个简单的实例学习case语句的基本语法格式。
![](https://epubservercos.yuewen.com/B53532/15937388204513606/epubprivate/OEBPS/Images/figure_0110_0001.jpg?sign=1739675982-QvzCfzu1wWIIgVDWrF7oE9rlqtMMtkbW-0-b0414a38fe709236a4df705e94cbf22a)
![](https://epubservercos.yuewen.com/B53532/15937388204513606/epubprivate/OEBPS/Images/figure_0111_0001.jpg?sign=1739675982-LZZBt2in70uFxGb0yAczlazUibBfcsgf-0-5c4cf8529a1e132f68dc2fbc95b99754)
![](https://epubservercos.yuewen.com/B53532/15937388204513606/epubprivate/OEBPS/Images/figure_0112_0001.jpg?sign=1739675982-JyLqGNDWmI6rSALxWVqXKf4mmHMQ8Pgu-0-44d20e9b4356ce20ddd85a2072abd4aa)
在1.3节,讲解了如何使用echo或者printf命令创建脚本菜单。但是因为没有if或case语句的支持,所以前面的脚本是无法对菜单进行响应的。现在继续优化完善这个脚本。
![](https://epubservercos.yuewen.com/B53532/15937388204513606/epubprivate/OEBPS/Images/figure_0112_0002.jpg?sign=1739675982-yzKgVAqDfpvC64f0dr0Mrv69M9JJbL64-0-2f739fa2120434b754780d1df5a82783)
![](https://epubservercos.yuewen.com/B53532/15937388204513606/epubprivate/OEBPS/Images/figure_0113_0001.jpg?sign=1739675982-2GWwuufluAkjMHtEf3avAD8RFaOIStd9-0-dd28fc135c00a1d360dde08dda55a260)
case命令可以使用管道符号(|)进行多个模式的匹配,编写有些交互脚本时需要使用这个功能。
![](https://epubservercos.yuewen.com/B53532/15937388204513606/epubprivate/OEBPS/Images/figure_0113_0002.jpg?sign=1739675982-47IdJFxT6qt4DC0huvqIAZqwgsy8FCEN-0-06194afa8c12839647c6526b42de5723)