用法:
case expression in
pattern1) ---------------->值1
statement1 ----------->表达式
;;
pattern2)
statement2
;;
pattern3)
statement3
;;
……
*)
statementn
esac
case、in、esac都是shell关键字。expression 表示表达式,pattern 表示匹配模式。
expression可以是一个变量,一个数字,一个字符串,还可以是一个数学计算表达式,或者是一个命令执行的结果,只要能得到expression的值就可以。
pattern可以是一个数字,一个字符串,一个正则表达式。
case会将expression的值与pattern1、pattern2、pattern3逐个进行匹配:
如果expression和某个pattern匹配成功,就会执行这个pattern后面对应的所有语句(该语句可以有一条也可以有多条),直到遇到双分号或者esac才停止,然后整个case语句就执行完了,程序会跳出整个case语句,执行esac后面的语句。
如果expression没有匹配到任何一个模式,那么就执行*)后面的语句(*表示其他所有值),直到遇见双分号;;或者esac才结束。*)相当于多个if分支语句中最后的else部分。
对*)的几点说明:
·shell case in中的*)用来托底,万一expression没有匹配到任何一个模式,*)可以做一些善后工作,或者给用户一些提示。
·可以没有*)部分。如果expression没有匹配到任何一个模式,那就不执行任何操作。
除最后一个分支外,(这个分支可以是普通分支可以是*)分支),其他的每个分支都必须以;;结尾。
;;代表一个分支的结束,不写的话会有语法错误。最后一个分支可以写;;,也可以不写。因为无论如何,执行到esac都会结束整个case语句。
上面的代码就是case in最常见用法,即expression部分是一个变量,pattern部分是一个数字或表达式。
case in和正则表达式
case in的pattern部分支持简单的正则表达式,可以使用以下几个格式:
如果不加以说明,shell的值都是字符串,expression和pattern也是按照字符串的方式来匹配的,下面代码看起来是判断数字是否相等,其实是判断字符串是否相等。
#!/bin/bash
printf "Input integer number: "
read num
case $num in
1)
echo "Monday"
;;
2)
echo "Tuesday"
;;
3)
echo "Wednesday"
;;
4)
echo "Thursday"
;;
5)
echo "Friday"
;;
6)
echo "Saturday"
;;
7)
echo "Sunday"
;;
*)
echo "error"
esac
运行结果:
Input integer number:3↙
Wednesday
最后一个分支*)并不是什么语法规定,他只是一个正则表达式,*表示任意字符串,所以不管expression的值是什么,*)总能匹配成功。
例如:
#!/bin/bash
printf "Input a character: "
read -n 1 char
case $char in
[a-zA-Z])
printf "\nletter\n"
;;
[0-9])
printf "\nDigit\n"
;;
[0-9])
printf "\nDigit\n"
;;
[,.?!])
printf "\nPunctuation\n"
;;
*)
printf "\nerror\n"
esac
运行结果1:
Input integer number: S
letter
运行结果2:
Input integer number: ,
Punctuation