shell中的case in 語句

2021-10-02 19:01:58 字數 3320 閱讀 2272

和其它程式語言類似,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...