Shellcasein语句详解
和其它编程语⾔类似,也⽀持两种分⽀结构(选择结构),分别是 if else 语句和 case in 语句。在《》⼀节中我们讲解了 if else 语句的⽤法,这节我们就来讲解 case in 语句。
当分⽀较多,并且判断条件⽐较简单时,使⽤ case in 语句就⽐较⽅便了。
《》⼀节的最后给出了⼀个例⼦,就是输⼊⼀个整数,输出该整数对应的星期⼏的英⽂表⽰,这节我们就⽤ case in 语句来重写代码,如下所⽰。
1. #!/bin/bash
2.
3. printf "Input integer number: "
4. read num
5.
6. case $num in
7. 1)
8. echo "Monday"
9. ;;
10. 2)
11. echo "Tuesday"
12. ;;
13. 3)
14. echo "Wednesday"
15. ;;
16. 4)
17. echo "Thursday"
18. ;;
19. 5)
20. echo "Friday"
21. ;;
22. 6)
23. echo "Saturday"
24. ;;
25. 7)
26. echo "Sunday"
27. ;;
28. *)
29. echo "error"
30. esac
运⾏结果:
Input integer number:3↙
Wednesday
看了这个例⼦,相信⼤家对 case in 语句有了⼀个⼤体上的认识,那么,接下来我们就正式开始讲解 case in 的⽤法,它的基本格式如下:case expression in
pattern1)
statement1
;;
pattern2)
shell代码statement2
;;
pattern3)
statement3
;;
……
*)
statementn
esac
case、int 和 esac 都是 Shell 关键字,expression 表⽰表达式,pattern 表⽰匹配模式。
expression 既可以是⼀个变量、⼀个数字、⼀个字符串,还可以是⼀个数学计算表达式,或者是命令的执⾏结果,只要能够得到expression 的值就可以。
pattern 可以是⼀个数字、⼀个字符串,甚⾄是⼀个简单的正则表达式。
case 会将 expression  的值与 pattern1、pattern2、pattern3 逐个进⾏匹配:
如果 expression 和某个模式(⽐如 pattern2)匹配成功,就会执⾏这模式(⽐如 pattern2)后⾯对应的所有语句(该语句可以有⼀条,也可以有多条),直到遇见双分号;;才停⽌;然后整个 case 语句就执⾏完了,程序会跳出整个 case 语句,执⾏ esac 后⾯的其它语句。
如果 expression 没有匹配到任何⼀个模式,那么就执⾏*)后⾯的语句(*表⽰其它所有值),直到遇见双分号;;或者esac才结束。*)相当于多个 if 分⽀语句中最后的 else 部分。
如果你有、、等编程经验,这⾥的;;和*)就相当于其它编程语⾔中的 break 和 default。
对*)的⼏点说明:
Shell case in 语句中的*)⽤来“托底”,万⼀ expression 没有匹配到任何⼀个模式,*)部分可以做⼀些“善后”⼯作,或者给⽤户⼀些提⽰。
可以没有*)部分。如果 expression 没有匹配到任何⼀个模式,那么就不执⾏任何操作。
除最后⼀个分⽀外(这个分⽀可以是普通分⽀,也可以是*)分⽀),其它的每个分⽀都必须以;;结尾,;;代表⼀个分⽀的结束,不写的话会有语法错误。最后⼀个分⽀可以写;;,也可以不写,因为⽆论如何,执⾏到 esac 都会结束整个 case in 语句。
上⾯的代码是 case in 最常见的⽤法,即 expression 部分是⼀个变量,pattern 部分是⼀个数字或者表达式。
case in 和正则表达式
case in 的 pattern 部分⽀持简单的正则表达式,具体来说,可以使⽤以下⼏种格式:
格式说明
*表⽰任意字符串。
[abc]表⽰ a、b、c 三个字符中的任意⼀个。⽐如,[15ZH] 表⽰ 1、5、Z、H 四个字符中的任意⼀个。
[m-n]表⽰从 m 到 n 的任意⼀个字符。⽐如,[0-9] 表⽰任意⼀个数字,[0-9a-zA-Z] 表⽰字母或数字。
|表⽰多重选择,类似逻辑运算中的或运算。⽐如,abc | xyz 表⽰匹配字符串 "abc" 或者 "xyz"。
如果不加以说明,Shell 的值都是字符串,expression 和 pattern 也是按照字符串的⽅式来匹配的;本节第⼀段代码看起来是判断数字是否相等,其实是判断字符串是否相等。
最后⼀个分⽀*)并不是什么语法规定,它只是⼀个正则表达式,*表⽰任意字符串,所以不管 expressio
n 的值是什么,*)总能匹配成功。
下⾯的例⼦演⽰了如何在 case in 中使⽤正则表达式:
1. #!/bin/bash
2.
3. printf "Input a character: "
4. read -n 1 char
5.
6. case $char in
7. [a-zA-Z])
8. printf "\nletter\n"
9. ;;
10. [0-9])
11. printf "\nDigit\n"
12. ;;
13. [0-9])
14. printf "\nDigit\n"
15. ;;
16. [,.?!])
17. printf "\nPunctuation\n"
18. ;;
19. *)
20. printf "\nerror\n"
21. esac
运⾏结果1:
Input integer number: S
letter
运⾏结果2:
Input integer number: ,
Punctuation

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。