新聞中心

為綠春等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及綠春網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站制作、成都做網(wǎng)站、綠春網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
當(dāng)分支較多,并且判斷條件比較簡單時(shí),使用 case in 語句就比較方便了。
《Shell if else》一節(jié)的最后給出了一個(gè)例子,就是輸入一個(gè)整數(shù),輸出該整數(shù)對(duì)應(yīng)的星期幾的英文表示,這節(jié)我們就用 case in 語句來重寫代碼,如下所示。
#!/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 語句有了一個(gè)大體上的認(rèn)識(shí),那么,接下來我們就正式開始講解 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è)簡單的正則表達(dá)式。
case 會(huì)將 expression 的值與 pattern1、pattern2、pattern3 逐個(gè)進(jìn)行匹配:
- 如果 expression 和某個(gè)模式(比如 pattern2)匹配成功,就會(huì)執(zhí)行這模式(比如 pattern2)后面對(duì)應(yīng)的所有語句(該語句可以有一條,也可以有多條),直到遇見雙分號(hào)
;;才停止;然后整個(gè) case 語句就執(zhí)行完了,程序會(huì)跳出整個(gè) case 語句,執(zhí)行 esac 后面的其它語句。 - 如果 expression 沒有匹配到任何一個(gè)模式,那么就執(zhí)行
*)后面的語句(*表示其它所有值),直到遇見雙分號(hào);;或者esac才結(jié)束。*)相當(dāng)于多個(gè) if 分支語句中最后的 else 部分。
對(duì)*)的幾點(diǎn)說明:
- Shell case in 語句中的
*)用來“托底”,萬一 expression 沒有匹配到任何一個(gè)模式,*)部分可以做一些“善后”工作,或者給用戶一些提示。 - 可以沒有
*)部分。如果 expression 沒有匹配到任何一個(gè)模式,那么就不執(zhí)行任何操作。
除最后一個(gè)分支外(這個(gè)分支可以是普通分支,也可以是*)分支),其它的每個(gè)分支都必須以;;結(jié)尾,;;代表一個(gè)分支的結(jié)束,不寫的話會(huì)有語法錯(cuò)誤。最后一個(gè)分支可以寫;;,也可以不寫,因?yàn)闊o論如何,執(zhí)行到 esac 都會(huì)結(jié)束整個(gè) case in 語句。
上面的代碼是 case in 最常見的用法,即 expression 部分是一個(gè)變量,pattern 部分是一個(gè)數(shù)字或者表達(dá)式。
case in 和正則表達(dá)式
case in 的 pattern 部分支持簡單的正則表達(dá)式,具體來說,可以使用以下幾種格式:
| 格式 | 說明 |
|---|---|
| * | 表示任意字符串。 |
| [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"。 |
如果不加以說明,Shell 的值都是字符串,expression 和 pattern 也是按照字符串的方式來匹配的;本節(jié)第一段代碼看起來是判斷數(shù)字是否相等,其實(shí)是判斷字符串是否相等。
最后一個(gè)分支*)并不是什么語法規(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
網(wǎng)站名稱:Shell case in語句詳解
標(biāo)題來源:http://www.dlmjj.cn/article/dppdjes.html


咨詢
建站咨詢
