case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。
可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
在某些时候,case要优于if,少写很多判断

#语法
case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac
#case 工作方式如上所示,取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

示例

请写一个,阿拉伯数字1-10转中文大写的程序,输入1,打印 壹...
如果要用if判断来实现,得写10个判断,这个时候使用case就比较舒服。
还有之前的ansible模块脚本,把if判断换成case就会很舒服。

#使用if
[root@zabbix01 ~]# cat if.sh
#!/bin/bash
num=$1
if [ $num -eq 1 ];then
  echo '壹'
elif [ $num -eq 2 ];then
  echo '贰'
elif [ $num -eq 3 ];then
  echo '叁'
elif [ $num -eq 4 ];then
  echo '肆'
elif [ $num -eq 5 ];then
  echo '伍'
elif [ $num -eq 6 ];then
  echo '陆'
elif [ $num -eq 7 ];then
  echo '柒'
elif [ $num -eq 8 ];then
  echo '捌'
elif [ $num -eq 9 ];then
  echo '玖'
elif [ $num -eq 10 ];then
  echo '拾'
else
  echo '请输入1-10的数字'
fi
#使用case
[root@zabbix01 ~]# cat case.sh
#!/bin/bash
num=$1
case $num in
    1)
      echo '壹'
      ;;
    2)
      echo '贰'
      ;;
    3)
      echo '叁'
      ;;
    4)
      echo '肆'
      ;;
    5)
      echo '伍'
      ;;
    6)
      echo '陆'
      ;;
    7)
      echo '柒'
      ;;
    8)
      echo '捌'
      ;;
    9)
      echo '玖'
      ;;
    10)
      echo '拾'
      ;;
    *)
      echo '请输入1-10的数字'
esac

[root@zabbix01 ~]# sh case.sh 1
壹
[root@zabbix01 ~]# sh case.sh 2
贰
[root@zabbix01 ~]# sh case.sh 3
叁
[root@zabbix01 ~]# sh case.sh 4
肆
[root@zabbix01 ~]# sh case.sh 5
伍
[root@zabbix01 ~]# sh case.sh 6
陆
[root@zabbix01 ~]# sh case.sh 7
柒
[root@zabbix01 ~]# sh case.sh 8
捌
[root@zabbix01 ~]# sh case.sh 9
玖
[root@zabbix01 ~]# sh case.sh 10
拾
[root@zabbix01 ~]# sh case.sh 11
请输入1-10的数字
[root@zabbix01 ~]# sh case.sh 12
请输入1-10的数字