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语句的基本语法格式。

在1.3节,讲解了如何使用echo或者printf命令创建脚本菜单。但是因为没有if或case语句的支持,所以前面的脚本是无法对菜单进行响应的。现在继续优化完善这个脚本。

case命令可以使用管道符号(|)进行多个模式的匹配,编写有些交互脚本时需要使用这个功能。