Unix / Linux Shell - 案例...esac 声明


您可以使用多个if...elif语句来执行多路分支。然而,这并不总是最好的解决方案,特别是当所有分支都依赖于单个变量的值时。

Shell 支持case...esac语句,它可以准确处理这种情况,并且比重复的 if...elif 语句更有效。

句法

case...esac语句的基本语法是给出一个要计算的表达式,并根据表达式的值执行多个不同的语句。

解释器根据表达式的值检查每种情况,直到找到匹配项。如果没有任何匹配,将使用默认条件。

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 语句退出而不执行任何操作。

模式数量没有上限,但最少为 1 个。

当语句部分执行时,命令 ;; 表示程序流程应该跳转到整个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
$
unix-决策.htm