『忘了再學』Shell流程控制 — 35、多分支case條件語句

繁華似錦Fighting發表於2022-06-21

1、case條件語句介紹

case語句和if…elif…else語句一樣都是多分支條件語句,不過和if多分支條件語句不同的是,case語句只能判斷一種條件關係,而if語句可以判斷多種條件關係。

case語句語法如下:

case $變數名 in
    "值1")
        如果變數的值等於值1,則執行程式1
        ;;
    "值2")
        如果變數的值等於值2,則執行程式2
        ;;

    …省略其他分支…

    *)
        如果變數的值都不是以上的值,則執行此程式
        ;;
esac  (注:case的反寫)

說明:

case語句和if…elif…else語句的區別:

case語句中只能判斷一個條件(值),是否符合某一個情況(值),是一種判斷。

if…elif…else語句,根據上一篇中的示例,我們可以看到if多分支條件語句,可以判斷一個輸入是否為空,是否是檔案,是否是目錄等多種條件關係,是不同的判斷。

2、case語句需要注意的內容

  • case語句,會取出變數中的值,然後與語句體中的值逐一比較。
    如果數值符合,則執行對應的程式,如果數值不符,則依次比較下一個值。
    如果所有的值都不符合,則執行*)下的程式,*)代表所有其他值。
  • case語句以“case”開頭,以“esac”結尾。
  • 每一個分支程式之後要通過;;雙分號結尾,代表該程式段結束。

3、練習

示例1

#!/bin/bash

# 請輸入你需去往的城市
echo "want to beijing,please input 1."
echo "want to shanghai,please input 2."
echo "want to chendu,please input 3."

# 接收輸入的資訊,賦值給變數cho
read -t 30 -p "please input your choice: " cho

# case條件判斷
case $cho in
    "1")
    echo "to beijin"
        ;;
    "2")
        echo "to shanghai"
        ;;
    "3")
        echo "to chendu"
        ;;
    *)
        echo "error input"
        ;;
esac

示例2

把上一篇文章if多分支條件語句的計算機練習中,第三層if巢狀改成case語句實現。

#!/bin/bash
# 字元介面加減乘除計算器。

# 1.通過read命令接收要計算的數值,並賦予變數num1和num2
read -t 30 -p "Please input num1: " num1
read -t 30 -p "Please input num2: " num2

# 2.通過read命令接收要計算的符號,並賦予變數ope.
read -t 30 -p "Please input a operator: " ope

# 第一層判斷
# 用來判斷num1、num2和ope中都有值。
# -n選項:判斷後邊的字串是否為空,非空為真。
# -a選項:邏輯與。
if [ -n "$num1" -a -n "$num2" -a -n "$ope" ]
    then
        # 判斷輸入的num1和num2內容是否是純數字 
        # 判斷一個變數的內容是否是純數字有很多方法,下面一種是簡單好理解的。
        # 定義變數test1和test2的值為$(命令)的結果。
        test1=$(echo $num1 | sed 's/[0-9]//g')
        test2=$(echo $num2 | sed 's/[0-9]//g')

        # 說明:
        # 就是通過sed命令,把變數num1值中的每一個字元,只要是0-9的內容,就替換為空。
        # 最後如果test1的值最後為空,證明num1變數中的內容全部為數字,因為全部被替換了。
        # 如果test1的值最後不為空,證明num1變數中的內容有非數字,即num1非純數字。

        # 第二層判斷,用來判斷num1和num2為數值。
        # 如果變數test1和test2的值為空,則證明numl和num2是數字.
        # -z選項:判斷字串是否為空(為空返回真)
        # -a選項:邏輯與。
        if [ -z "$test1" -a -z "$test2" ]
            then
                # 如果test1和test2是數字,則執行以下命令。

                # 第三層判斷用來確認運算子。
                # 確認變數$ope中是什麼運算子。
                case $ope in
                    "+")
                        # 如果是加號則執行加法運算。
                        value=$(($num1+$num2))
                        ;;
                    "-")
                        # 如果是減號,則執行減法運算。
                        value=$(($num1-$num2))
                        ;;
                    "*")
                        # 如果是乘號,則執行乘法運算。
                        value=$(($num1*$num2))
                        ;;
                    "/")
                        # 如果是除號,則執行除法運算。
                        value=$(($num1/$num2))
                        ;;

                    *)
                        # 如果運算子不匹配,提示輸入有效的符號
                        echo "Please enter a valid symbol."
                        # 並退出程式,返回錯誤程式碼10。
                        exit 10
                        ;;
                esac
        else
            # 如果test1和test2不為空,說明numl和num2不是數字。
            # 則提示輸入有效的數值。
            echo "Please enter a valid value."
            # 並退出程式,返回錯誤程式碼11。
            exit 11
        fi

else
    echo "qing input neirong."
    exit 12
fi

# 輸出數值運算的結果。
echo "$num1 $ope $num2 :$value"

相關文章