十年运维系列之基础篇 - Linux
作者:曾林
联系:[email protected]
版权:文章未经同意请勿转载
一、引言
本章节将继续讲解流控制的内容。在上面讲解if控制流分支中,我们构建了一个简单的菜单,并建立了用于响应用户选择的逻辑。为达到这个目的,我们使用了一系列的if命令来确定哪个是选中项。这种类型的程序构造经常会被使用到,所以许多编程语言(包括shell)为基于多项选择的判断提供了流控制机制。
二、case命令
bash的多项选择复合命令被称为case,其语法如下所示:
case word in pattern [| pattern ]...) commands ;; esac
回顾以下的脚本程序,可以看到用于响应用户选择的逻辑如下所示:
1 #!/bin/bash 2 3 # foo.sh : a menu driven system information program 4 5 clear 6 echo " 7 Please Select: 8 9 1. Display System information 10 2. Display Disk Space 11 3. Display Home Space Utilization 12 0. Quit 13 " 14 15 read -p "Enter selection [0 ~ 3] > " 16 17 if [[ $REPLY =~ ^[0-3]$ ]]; then 18 if [[ $REPLAY == 0 ]]; then 19 echo "Program terminated." 20 exit 21 fi 22 23 if [[ $REPLY == 1 ]]; then 24 echo "Hostname: $HOSTNAME" 25 uptime 26 exit 27 fi 28 29 if [[ $REPLY == 2 ]]; then 30 df -h 31 exit 32 fi 33 34 if [[ $REPLY == 3 ]]; then 35 if [[ $(id -u) == 0 ]]; then 36 echo "Home Space Utilization(All Users): " 37 du -sh /home/* 38 else 39 echo "Home Space Utilization:" 40 du -sh /$HOME 41 fi 42 exit 43 fi 44 else 45 echo "Invalid entry." >&2 46 exit 1 47 fi
在这里,如果使用case语句则可以简化以上的逻辑。具体如下代码:
1 #!/bin/bash 2 3 # foo-case.sh: a menu driven system information program 4 5 clear 6 echo " 7 8 Please Select: 9 1. Display System Information 10 2. Display Disk Space 11 3. Display Home Space Utilization 12 0. Quit 13 " 14 15 read -p "Enter selection [0~3]> " 16 17 case $REPLY in 18 0) 19 echo "Program terminated." 20 exit 21 ;; 22 1) echo "Hostname: $HOSTNAME" 23 uptime 24 ;; 25 2) df -h 26 ;; 27 3) if [[ $(id -u) == 0 ]]; then 28 echo "Home Space Utilization(All Users)" 29 du -sh /home/* 30 else 31 echo "Home Space Utilizaiton" 32 du -sh /$HOME 33 fi 34 ;; 35 *) 36 echo "Invalid entry" >&2 37 exit 1 38 ;; 39 esac
case命令将关键字的值——本例中,即$REPLY的值——与特定的模式相比较,若发现吻合的模式后,将不再对比剩余的模式。
1. 模式
同路径名展开一样,case使用以“)”字符结尾的模式。下表展示了一些有效的模式。
模式 | 描述 |
a) | 若关键字为a则吻合 |
[[:alpha:]]) | 若关键字为单个字母则吻合 |
???) | 若关键字为三个字符则吻合 |
*.txt) | 若关键字以.txt结尾则吻合 |
*) | 与任何关键字吻合。在case命令的最后的一个模式应用此项是个不错的做法,可对应所有前模式不吻合的关键字,也就是对应任何可能的无效值 |
下面是一个使用模式的范例。
时间: 2024-10-04 16:47:16