用法 case;in;esac都是shell关键字 expression是表达式(既可以是一个变量,一个数字,一个字符串,还可以是一个数学计算表达式,或者是命令的执行结果,只要可以得到expression的值就行) pattern是匹配模式(一个数字,一个字符串,或者一个简单的正则表达式)
case expression in pattern1) statement1 ;; pattern2) statement2 ;; ...... *) statement2 esac
工作模式
case会将expression的值与pattern1~n进行匹配: 1 如果expression和某个模式匹配成功,就会执行这个模式后面对应的所有语句,知道遇见分号;;才停止 然后真各国case语句就执行完毕,程序会跳出case语句,执行esac后面的语句。 2 如果expression没有匹配到任何一个模式,那么就执行*) 后面的语句,知道遇见双分号;;或者esac才结束。 相当于多个if语句中的else语句。 3 如果expression没有匹配到任何一个模式,那么*)部分就可以做善后工作,或者给用户一些提示。 4 可以没有*)部分。如果没有匹配到任何一个模式,那么就不执行任何操作。
注意:
除最后一个一个分支外,其它分支必须以;;结尾,;;代表一个分支的结束,不写会程序错误。
esac会结束整个case in语句。
case in 的pattern 支持部分简单的正则表达式: 格式 说明 * 表示任意字符串 [abc] 表示a b c三个字符中的任意一个 m-n 表示m-n中的任意一个字符 I(竖杠) 表示多重选择类似于或运算
#!/bin/bash echo “Please input a number” read num case $num in 1) echo “haha” ;; 2) echo “hehe” ;; 3) echo “xixi” ;; 4) echo “dudu” ;; *) echo “error” esac
[root@localhost case]# sh 01.sh
Please input a number
2
Hehe
#如果此处需要用echo的话,就不能用read -n 1 因为没有用户输入完整的数据完成后时没有换行符的
#-n 1表示只读一个字符,运行脚本后,只要用户输入一个字符,立即读取结束,不用等待用户按下回车键
[root@localhost case_in]# cat 02.sh
#!/bin/bash echo "In put a character:" #如果此处需要用echo的话,就不能用read -n 1 因为没有用户输入完整的数据完成后时没有换行符的 #-n 1表示只读一个字符,运行脚本后,只要用户输入一个字符,立即读取结束,不用等待用户按下回车键 read -n 1 char case $char in [a-zA-Z]) echo "letter" ;; [0-9]) echo "Digit" ;; [,.?!]) echo "Punctuation" ;; *) esac
[root@localhost case_in]# sh 02.sh
In put a character:
5Digit
[root@localhost case_in]#
[root@localhost case_in]# sh 02.sh
In put a character:
gletter
[root@localhost case_in]#
[root@localhost case_in]# sh 02.sh
In put a character:
.Punctuation