(030) Linux之流控制case分支

十年运维系列之基础篇 - Linux

作者:曾林 

联系:[email protected]

网站:www.jplatformx.com

版权:文章未经同意请勿转载


一、引言

  本章节将继续讲解流控制的内容。在上面讲解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命令的最后的一个模式应用此项是个不错的做法,可对应所有前模式不吻合的关键字,也就是对应任何可能的无效值

  下面是一个使用模式的范例。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。