C語言中文網 目錄
Shell腳本
1 Shell是什么
2 Shell是運維人員必須掌握的技能
3 常用的Shell有哪些
4 進入Shell的兩種方式
5 Shell命令的基本格式
6 Shell命令的本質到底是什么?如何自己實現一個命令?
7 Shell命令的選項和參數在本質上是什么
8 Shell命令提示符
9 修改命令提示符
10 第一個Shell腳本
11 執行Shell腳本
12 Shell四種運行方式(啟動方式)
13 Shell配置文件(配置腳本)的加載
14 如何編寫自己的Shell配置文件?
15 Shell變量
16 Shell變量的作用域
17 Shell命令替換
18 Shell位置參數
19 Shell特殊變量
20 Shell $*和$@的區別
21 Shell $?
22 Shell字符串詳解
23 Shell字符串拼接
24 Shell字符串截取
25 Shell數組
26 Shell獲取數組長度
27 Shell數組拼接
28 Shell刪除數組元素
29 Shell關聯數組
30 Shell內建命令
31 Shell alias命令
32 Shell echo命令
33 Shell read命令
34 Shell exit命令
35 Shell declare和typeset命令
36 Shell數學計算
37 Shell (())
38 Shell let命令
39 Shell $[]
40 Shell expr命令
41 Linux bc命令
42 Shell declare -i
43 Shell if else
44 Shell退出狀態
45 Shell test命令
46 Shell [[]]
47 Shell case in
48 Shell while
49 Shell until
50 Shell for
51 Shell select in
52 Shell break和continue
53 Shell函數
54 Shell函數參數
55 Shell函數返回值精講
56 Shell重定向
57 Linux中的文件描述符到底是什么?
58 結合文件描述符談重定向,徹底理解重定向的本質!
59 使用exec命令操作文件描述符
60 Shell代碼塊重定向
61 Shell Here Document
62 Shell Here String
63 Shell組命令
64 Shell進程替換
65 Linux管道
66 子Shell和子進程到底有什么區別?
67 如何檢測子Shell和子進程?
68 Shell過濾器
69 Linux中的信號
70 Bash Shell中的信號
71 Linux進程是什么
72 Shell模塊化(把代碼分散到多個腳本文件中)
首頁 > Shell腳本 閱讀:2,183

Shell case in語句詳解

< 上一頁Shell [[]] Shell while下一頁 >

和其它編程語言類似,Shell 也支持兩種分支結構(選擇結構),分別是 if else 語句和 case in 語句。在《Shell if else》一節中我們講解了 if else 語句的用法,這節我們就來講解 case in 語句。

當分支較多,并且判斷條件比較簡單時,使用 case in 語句就比較方便了。

Shell if else》一節的最后給出了一個例子,就是輸入一個整數,輸出該整數對應的星期幾的英文表示,這節我們就用 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
運行結果:
Input integer number:3↙
Wednesday

看了這個例子,相信大家對 case in 語句有了一個大體上的認識,那么,接下來我們就正式開始講解 case in 的用法,它的基本格式如下:

case expression in
    pattern1)
        statement1
        ;;
    pattern2)
        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 部分。
如果你有C語言C++Java 等編程經驗,這里的;;*)就相當于其它編程語言中的 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 也是按照字符串的方式來匹配的;本節第一段代碼看起來是判斷數字是否相等,其實是判斷字符串是否相等。

最后一個分支*)并不是什么語法規定,它只是一個正則表達式,*表示任意字符串,所以不管 expression 的值是什么,*)總能匹配成功。

下面的例子演示了如何在 case in 中使用正則表達式:
#!/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
運行結果1:
Input integer number: S
letter

運行結果2:
Input integer number: ,
Punctuation
< 上一頁Shell [[]] Shell while下一頁 >

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo