Unix / Linux Shell - case...esac 声明

  • 简述

    多重 if...elif语句来执行多路分支。然而,这并不总是最好的解决方案,尤其是当所有分支都依赖于单个变量的值时。
    壳牌支持 case...esac 处理这种情况的语句,它比重复的 if...elif 语句更有效。
  • 句法

    的基本语法 case...esac statement 是给出一个表达式来判断并根据表达式的值执行几个不同的语句。
    解释器根据表达式的值检查每个 case,直到找到匹配项。如果没有匹配项,将使用默认条件。
    
    case word in
       pattern1)
          Statement(s) to be executed if pattern1 matches
          ;;
       pattern2)
          Statement(s) to be executed if pattern2 matches
          ;;
       pattern3)
          Statement(s) to be executed if pattern3 matches
          ;;
       *)
         Default condition to be executed
         ;;
    esac
    
    这里将字符串单词与每个模式进行比较,直到找到匹配项。执行匹配模式后的语句。如果未找到匹配项,则 case 语句退出而不执行任何操作。
    没有最大数量的模式,但最少为一个。
    当语句部分执行时,命令 ;; 表示程序流应该跳到整个case语句的末尾。这类似于 C 编程语言中的 break。
  • 例子

    
    #!/bin/sh
    FRUIT="kiwi"
    case "$FRUIT" in
       "apple") echo "Apple pie is quite tasty." 
       ;;
       "banana") echo "I like banana nut bread." 
       ;;
       "kiwi") echo "New Zealand is famous for kiwi." 
       ;;
    esac
    
    执行后,您将收到以下结果 -
    
    New Zealand is famous for kiwi.
    
    case 语句的一个很好的用途是判断命令行参数,如下所示 -
    
    #!/bin/sh
    option="${1}" 
    case ${option} in 
       -f) FILE="${2}" 
          echo "File name is $FILE"
          ;; 
       -d) DIR="${2}" 
          echo "Dir name is $DIR"
          ;; 
       *)  
          echo "`basename ${0}`:usage: [-f file] | [-d directory]" 
          exit 1 # Command to come out of the program with status 1
          ;; 
    esac 
    
    这是上述程序的示例运行 -
    
    $./test.sh
    test.sh: usage: [ -f filename ] | [ -d directory ]
    $ ./test.sh -f index.htm
    $ vi test.sh
    $ ./test.sh -f index.htm
    File name is index.htm
    $ ./test.sh -d unix
    Dir name is unix
    $