新聞中心

為綠春等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及綠春網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、成都做網(wǎng)站、綠春網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
當(dāng)分支較多,并且判斷條件比較簡(jiǎn)單時(shí),使用 case in 語(yǔ)句就比較方便了。
《Shell if else》一節(jié)的最后給出了一個(gè)例子,就是輸入一個(gè)整數(shù),輸出該整數(shù)對(duì)應(yīng)的星期幾的英文表示,這節(jié)我們就用 case in 語(yǔ)句來(lái)重寫(xiě)代碼,如下所示。
#!/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 運(yùn)行結(jié)果:
Input integer number:3↙
Wednesday
看了這個(gè)例子,相信大家對(duì) case in 語(yǔ)句有了一個(gè)大體上的認(rèn)識(shí),那么,接下來(lái)我們就正式開(kāi)始講解 case in 的用法,它的基本格式如下:
case expression in
pattern1)
statement1
;;
pattern2)
statement2
;;
pattern3)
statement3
;;
……
*)
statementn
esac
case、in 和 esac 都是 Shell 關(guān)鍵字,expression 表示表達(dá)式,pattern 表示匹配模式。
- expression 既可以是一個(gè)變量、一個(gè)數(shù)字、一個(gè)字符串,還可以是一個(gè)數(shù)學(xué)計(jì)算表達(dá)式,或者是命令的執(zhí)行結(jié)果,只要能夠得到 expression 的值就可以。
- pattern 可以是一個(gè)數(shù)字、一個(gè)字符串,甚至是一個(gè)簡(jiǎn)單的正則表達(dá)式。
case 會(huì)將 expression 的值與 pattern1、pattern2、pattern3 逐個(gè)進(jìn)行匹配:
- 如果 expression 和某個(gè)模式(比如 pattern2)匹配成功,就會(huì)執(zhí)行這模式(比如 pattern2)后面對(duì)應(yīng)的所有語(yǔ)句(該語(yǔ)句可以有一條,也可以有多條),直到遇見(jiàn)雙分號(hào)
;;才停止;然后整個(gè) case 語(yǔ)句就執(zhí)行完了,程序會(huì)跳出整個(gè) case 語(yǔ)句,執(zhí)行 esac 后面的其它語(yǔ)句。 - 如果 expression 沒(méi)有匹配到任何一個(gè)模式,那么就執(zhí)行
*)后面的語(yǔ)句(*表示其它所有值),直到遇見(jiàn)雙分號(hào);;或者esac才結(jié)束。*)相當(dāng)于多個(gè) if 分支語(yǔ)句中最后的 else 部分。
對(duì)*)的幾點(diǎn)說(shuō)明:
- Shell case in 語(yǔ)句中的
*)用來(lái)“托底”,萬(wàn)一 expression 沒(méi)有匹配到任何一個(gè)模式,*)部分可以做一些“善后”工作,或者給用戶一些提示。 - 可以沒(méi)有
*)部分。如果 expression 沒(méi)有匹配到任何一個(gè)模式,那么就不執(zhí)行任何操作。
除最后一個(gè)分支外(這個(gè)分支可以是普通分支,也可以是*)分支),其它的每個(gè)分支都必須以;;結(jié)尾,;;代表一個(gè)分支的結(jié)束,不寫(xiě)的話會(huì)有語(yǔ)法錯(cuò)誤。最后一個(gè)分支可以寫(xiě);;,也可以不寫(xiě),因?yàn)闊o(wú)論如何,執(zhí)行到 esac 都會(huì)結(jié)束整個(gè) case in 語(yǔ)句。
上面的代碼是 case in 最常見(jiàn)的用法,即 expression 部分是一個(gè)變量,pattern 部分是一個(gè)數(shù)字或者表達(dá)式。
case in 和正則表達(dá)式
case in 的 pattern 部分支持簡(jiǎn)單的正則表達(dá)式,具體來(lái)說(shuō),可以使用以下幾種格式:
| 格式 | 說(shuō)明 |
|---|---|
| * | 表示任意字符串。 |
| [abc] | 表示 a、b、c 三個(gè)字符中的任意一個(gè)。比如,[15ZH] 表示 1、5、Z、H 四個(gè)字符中的任意一個(gè)。 |
| [m-n] | 表示從 m 到 n 的任意一個(gè)字符。比如,[0-9] 表示任意一個(gè)數(shù)字,[0-9a-zA-Z] 表示字母或數(shù)字。 |
| | | 表示多重選擇,類似邏輯運(yùn)算中的或運(yùn)算。比如,abc | xyz 表示匹配字符串 "abc" 或者 "xyz"。 |
如果不加以說(shuō)明,Shell 的值都是字符串,expression 和 pattern 也是按照字符串的方式來(lái)匹配的;本節(jié)第一段代碼看起來(lái)是判斷數(shù)字是否相等,其實(shí)是判斷字符串是否相等。
最后一個(gè)分支*)并不是什么語(yǔ)法規(guī)定,它只是一個(gè)正則表達(dá)式,*表示任意字符串,所以不管 expression 的值是什么,*)總能匹配成功。
下面的例子演示了如何在 case in 中使用正則表達(dá)式:
#!/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 運(yùn)行結(jié)果1:
Input integer number: S
letter
運(yùn)行結(jié)果2:
Input integer number: ,
Punctuation
名稱欄目:Shell case in語(yǔ)句詳解
路徑分享:http://fisionsoft.com.cn/article/dppdjes.html


咨詢
建站咨詢
