结构

case param in
value1)
    statement1
    ...
    ;;
value2)
    statement2
    ...
    ;;
...)
    ...
    ;;
esac
  • headcase param in统一模式的头,param为变量名
  • match : value,分支选择标记
  • statement:具体操作语句,不限数量
  • tail : ;;,分支操作结束标记,不用break,自动跳出
  • over : esaccase反拼

特殊

  • 对比

case和高级语言中的switch-case没有太大的区别,具体列举如下。

position switch case de ion
头部 switch case 关键字不同
语法不同in
分支 case value case直接通过value选择分支
操作 statement statement 无区别
分支结束 break ;; switch可以多分支共用同一语句,或者break跳出单独使用
case;;默认跳出和结束,不用break
默认 default *) 语法标记不同
结束符 } esac switch更多使用{}囊括代码块
case强制esac结束
  • 特色

case中的valueswitch的最大区别,并不是结构上的差异,而在于匹配的方式不同。

switch语句中的match仅仅是单一的值匹配case更倾向于模式匹配

#!/bin/bash
case $1 in
[0-9])
    echo \"number\"
    ;;
[a-z])
    echo \"lowercase alpha\"
    ;;
[A-Z])
    echo \"uppercase alpha\"
    ;;
*)
    echo \"special character\"
    ;;
esac

值得注意的是,这种方式并不是正则匹配,它是shell的通配符匹配。

#!/bin/bash
case $1 in 
[:alpha:])
    echo \"alpha\"
    ;;
*)
    echo \"other\"
    ;;
esac

所以呢,想在脚本中去进行复杂的模式匹配,先要精修一下通配符

不是正则表达式,这点需要记住,别 到时候查错了手册就尴尬了。

脚本

  • 四则
#!/bin/bash
if [ $# -ne 3 ];then
    echo -e \"param length error\\nexample 1 + 2\"
    exit 2
fi
case $2 in
+)
    echo $(($1 + $3))
    ;;
-)
    echo $(($1 - $3))
    ;;
x)
    echo $(($1 * $3))
    ;;
/)
    echo $(($1 / $3))
    ;;
*)
    echo \"unknow calc type : $2\"
    ;;
esac
收藏 打印