• 本页内容

40. case 命令


语法:

case var in
  pattern1 )
    command1
    command2
    ...
  ;;
  pattern2 )
    command3
    command4
    ...
  ;;
esac
  • 如果var的值与pattern1匹配,它将执行 command1、command2 以及pattern1块中的任何其他命令。
  • 如果var的值与pattern2匹配,它将执行 command3、command4 以及pattern2块中的任何其他命令。
  • case语句以esac结尾,它只不过是单词 case 的倒序写法。
  • 每组命令应以两个分号(;;) 结尾。

这个简单的案例示例根据命令行上给出的参数设置变量 state capital

$ cat case1.sh
stateabbr=${1}
case $stateabbr in
  CA )
    state="California"
    capital="Sacramento"
    ;;
  NV )
    state="Nevada"
    capital="Carson City"
    ;;
esac
echo "$state Capital is $capital"

$ ./case1.sh CA
California Capital is Sacramento

在上面的示例中,当 stateabbr 的值为 “CA” 时,bash 执行模式 “CA” 下的两个命令。 它会跳过此后的其他情况,在esac语句之后继续。

case通常用于创建供用户选择的菜单:

$ cat case2.sh
echo "MAIN MENU"
echo "---------"
echo "a. Backup Log files"
echo "b. Backup Config files"
echo "c. Backup Home Directory"
echo "d. Exit"
echo "Enter your choice:"

read choice
case $choice in
a | A ) echo "Backing up log files..";;
b | B ) echo "Backing up config files..";;
c | C ) echo "Backing up home directory..";;
d | D ) exit;;
    * ) echo "Invalid choice!";;
esac

在上面的示例中,模式不仅仅包含一个值。 它有多个值。 例如a | A ),表示无论用户输入 a 还是 A,都将执行该模式中的命令。

上面列表中的最后一个模式是*),它匹配任何字符。 当到达这里时,这意味着在这一点之前没有任何模式是匹配的。 因此,这应该是用户输入的无效值。