和其它程式語言類似,shell 也支援兩種分支結構(選擇結構),分別是 if else 語句和 case in 語句。在《shell if else》一節中我們講解了 if else 語句的用法,這節我們就來講解 case in 語句。
當分支較多,並且判斷條件比較簡單時,使用 case in 語句就比較方便了
[root@server1 mnt]# cat test.sh
#!/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
case expression in
pattern1)
statement1
;;pattern2)
statement2
;;pattern3)
statement3
;;……
*)statementn
esac
case、in 和 esac 都是 shell 關鍵字,expression 表示表示式,pattern 表示匹配模式
expression 既可以是乙個變數、乙個數字、乙個字串,還可以是乙個數學計算表示式,或者是命令的執行結果,只要能夠得到 expression 的值就可以。
pattern 可以是乙個數字、乙個字串,甚至是乙個簡單的正規表示式。
case 會將 expression 的值與 pattern1、pattern2、pattern3 逐個進行匹配:
如果 expression 和某個模式(比如 pattern2)匹配成功,就會執行這模式(比如 pattern2)後面對應的所有語句(該語句可以有一條,也可以有多條),直到遇見雙分號;;才停止;然後整個 case 語句就執行完了,程式會跳出整個 case 語句,執行 esac 後面的其它語句。
如果 expression 沒有匹配到任何乙個模式,那麼就執行*)後面的語句(表示其它所有值),直到遇見雙分號;;或者esac才結束。)相當於多個 if 分支語句中最後的 else 部分
對*)的幾點說明:
shell case in 語句中的*)用來「托底」,萬一 expression 沒有匹配到任何乙個模式,*)部分可以做一些「善後」工作,或者給使用者一些提示。
可以沒有*)部分。如果 expression 沒有匹配到任何乙個模式,那麼就不執行任何操作
除最後乙個分支外(這個分支可以是普通分支,也可以是*)分支),其它的每個分支都必須以;;結尾,;;代表乙個分支的結束,不寫的話會有語法錯誤。最後乙個分支可以寫;;,也可以不寫,因為無論如何,執行到 esac 都會結束整個 case in 語句。
上面的**是 case in 最常見的用法,即 expression 部分是乙個變數,pattern 部分是乙個數字或者表示式
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"
下面的例子演示了如何在 case in 中使用正規表示式:
[root@server1 mnt]# vim test.sh
[root@server1 mnt]# sh test.sh
input a character: d
letter
[root@server1 mnt]# sh test.sh
input a character: v
letter
[root@server1 mnt]# sh test.sh
input a character: 0
digit
[root@server1 mnt]#
[root@server1 mnt]# sh test.sh
input a character: 1
digit
[root@server1 mnt]# sh test.sh
input a character: ?
punctuation
[root@server1 mnt]# cat test.sh
# 如果此處需要用echo的話 就不能用read -n 1 因為沒有使用者的輸入資料完成後是沒有換行符的
#!/bin/bash
printf "input a character: "
read -n 1 char
case $char in
[a-za-z])
printf "\nletter\n" 或者 echo -e "\nletter"
;;[0-9])
printf "\ndigit\n"
;;[0-9])
printf "\ndigit\n"
;;[,.?!])
printf "\npunctuation\n"
;;*)
printf "\nerror\n"
esac
printf
printf和c語言的使用方式類似。和echo不一樣,它不會在最後自動加上換行,需要寫入命令中
如果不加以說明,shell 的值都是字串,expression 和 pattern 也是按照字串的方式來匹配的;本節第一段**看起來是判斷數字是否相等,其實是判斷字串是否相等
最後乙個分支*)並不是什麼語法規定,它只是乙個正規表示式,表示任意字串,所以不管 expression 的值是什麼,)總能匹配成功
[root@server1 mnt]# sh test.sh
input a character:
error
shell中的case in語句
和其它程式語言類似,shell也支援兩種分支結構 選擇結構 分別是if else 語句和 case in 語句。格式 case expression in pattern 1 statement1 pattern 2 statement2 statementn esac 其中 case in 和es...
shell指令碼學習(十四) case in語句
格式 case expression in pattern 1 statement1 pattern 2 statement2 statementn esac 1 case in 和esac都是shell關鍵字,expression表示表示式,pattern表示匹配模式 2 expression既可...
shell 中的if語句
1 2 3 4 if a a 空格用 標示 then echo a a fi 最近幾天寫指令碼,遇到if語句時總是吃不準。這次總結一下。使用if語句有2中方式,一種是使用test命令另一種是使用 其中後者比較常用。方法一,使用test命令,這個命令返回乙個boolean值。1 test e data...