(030) Linux之流控制case分支

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

作者:曾林 

联系:1494445739@qq.com

网站: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命令的最后的一个模式应用此项是个不错的做法,可对应所有前模式不吻合的关键字,也就是对应任何可能的无效值

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

 1 #!/bin/bash
 2 
 3 # foo-esac: 
 4 
 5 read -p "enter word > "
 6 
 7 case $REPLY in
 8     [[:alpha:]])    echo "is a single alphabetic character." ;;
 9     [ABC][0-9])     echo "is A, B, or C followed by a digit." ;;
10     ???)            echo "is three characters long." ;;
11     *.txt)          echo "is a word ending '.txt'" ;;
12     *)              echo "is something else." ;;
13 esac

  2. 多个模式的组合

  我们也可以使用竖线作为分隔符来组合多个模式,模式之间是“或”的条件关系。这对一些类似同时处理大写和小写字母的事件很有帮助。如下所示:

 1 #!/bin/bash
 2 
 3 # case-menu: a menu driven system information program
 4 
 5 clear
 6 echo "
 7 Please Select:
 8 
 9 A.  Display System Information
10 B.  Display Disk Space
11 C.  Display Home Space Utilization
12 Q.  Quit
13 "
14 
15 read -p "Enter selection [A, B, C or Q] > "
16 
17 case $REPLY in
18     q|Q)    echo "Program terminated."  ;;
19     a|A)    echo "Hostname: $HOSTNAME"  uptime  ;;
20     b|B)    df -h   ;;  
21     c|C)    if  [[ $(id -u) == 0 ]]; then 
22                 echo "Display Home Space Utilizaiton(All Users)"
23                 du -sh /home/*
24             else
25                 echo "Display Home Space Utilization"
26                 du -sh /$HOME
27             fi  
28             ;;  
29       *)  
30             echo "Invalid entry" >&2
31             exit 1
32             ;;  
33 esac

  以上代码将原代码修改为通过字母而不是数字来进行菜单选择。可以注意到在新模式下,用户进行选择时可以输入大写字母,也可以输入小写字母。

 

posted @ 2015-03-20 15:16  jplatformx  阅读(226)  评论(0编辑  收藏  举报