Linux-scripts-選擇結構

9.Scripts

本章同步視頻:https://edu.51cto.com/sd/e4874

9.4 選擇結構

9.4.1 利用 if .... then

1.單分支選擇結構

(1)格式1

if  condition

then

    statement(s)

fi

condition是判斷條件,如果 condition 成立(返回“真”),那麼 then 後邊的語句將會被執行;如果 condition 不成立(返回“假”),那麼不會執行任何語句。

注意,最後必須以fi來閉合,fi 就是 if 倒過來拼寫。也正是有了 fi 來結尾,所以即使有多條語句也不需要用{ }包圍起來。

[root@localhost tmp]# vim 1.sh

#!/bin/bash

if test -e /root

then

        echo "/root is here!"

fi

[root@localhost tmp]# sh 1.sh

/root is here!

(2)格式2

if  condition;  then

    statement(s)

fi

注意 condition 後邊的分號;,當 if 和 then 位於同一行的時候,這個分號是必須的,否則會有語法錯誤。

[root@localhost tmp]# vim 1.sh

#!/bin/bash

if test -e /root ;then

        echo "/root is here!"

fi

[root@localhost tmp]# sh 1.sh

/root is here!

(3)實例

[root@localhost tmp]# vim 1.sh

#!/bin/bash

read -p "Please input (Y/N): " yn

if [ "${yn}" == "Y" ] || [ "${yn}" == "y" ]; then

echo "OK, continue"

exit 0

fi

if [ "${yn}" == "N" ] || [ "${yn}" == "n" ]; then

echo "Oh, interrupt!"

exit 0

fi

echo "I don't know what your choice is" && exit 0

[root@localhost tmp]# sh 1.sh

Please input (Y/N): n       #輸入n

Oh, interrupt!

[root@localhost tmp]# sh 1.sh

Please input (Y/N): y       #輸入y

OK, continue

[root@localhost tmp]# sh 1.sh

Please input (Y/N): c       #輸入c

I don't know what your choice is

2.雙分支選擇結構

(1)格式

if  condition

then

   statement1

else

   statement2

fi

if  condition ;then

   statement1

else

   statement2

fi

如果 condition 成立,那麼 then 後邊的 statement1 語句將會被執行;否則,執行 else 後邊的 statement2 語句。

(2)案例

[root@localhost tmp]# vim 1.sh

#!/bin/bash

read -p "input a:" a

read -p "input b:" b

if (( $a == $b ))          #算術運算用(())

then

    echo "a和b相等"

else

    echo "a和b不相等,輸入錯誤"

fi

[root@localhost tmp]# sh 1.sh

input a:3

input b:5

a和b不相等,輸入錯誤

[root@localhost tmp]# sh 1.sh

input a:3

input b:3

a和b相等

3.多分支選擇結構

(1)格式

if  condition1  ;then

   statement1

elif condition2  ;then

    statement2

elif condition3  ;then

    statement3

……

else

   statementn

fi

注意,if 和 elif 後邊都得跟着 then。

整條語句的執行邏輯爲:

如果 condition1 成立,那麼就執行 if 後邊的 statement1;如果 condition1 不成立,那麼繼續執行 elif,判斷 condition2。

如果 condition2 成立,那麼就執行 statement2;如果 condition2 不成立,那麼繼續執行後邊的 elif,判斷 condition3。

如果 condition3 成立,那麼就執行 statement3;如果 condition3 不成立,那麼繼續執行後邊的 elif。

如果所有的 if 和 elif 判斷都不成立,就進入最後的 else,執行 statementn。

(2)案例1

[root@localhost tmp]# vim 1.sh

#!/bin/bash

if [ "${1}" == "hello" ]; then

echo "Hello, how are you ?"

elif [ "${1}" == "" ]; then

echo "You MUST input parameters, ex> {${0} someword}"

else

echo "The only parameter is 'hello', ex> {${0} hello}"

fi

[root@localhost tmp]# sh 1.sh

You MUST input parameters, ex> {1.sh someword}

[root@localhost tmp]# sh 1.sh nihao

The only parameter is 'hello', ex> {1.sh hello}

[root@localhost tmp]# sh 1.sh hello

Hello, how are you ?

(3)案例2

#!/bin/bash

printf "Input integer number: "

read num

if test $num -eq 1 ; then      #第一種條件寫法

    echo "Monday"

elif [ $num -eq 2 ] ; then      #第二種條件寫法

    echo "Tuesday"

elif [[ $num -eq 3 ]]; then     #第三種條件寫法

    echo "Wednesday"

elif ((num==4)); then           #第四種條件寫法

    echo "Thursday"

elif ((num==5)); then           #第四種僅限數值用法

    echo "Friday"

elif ((num==6)); then

    echo "Saturday"

elif ((num==7)); then

    echo "Sunday"

else

    echo "error"

fi

9.4.2   利用 case ..... esac 判斷

1.格式

case expression in

    pattern1)

        statement1

        ;;

    pattern2)

        statement2

        ;;

    pattern3)

        statement3

        ;;

    ……

    *)

        statementn

esac

2.說明:

u  case、in 和 esac 都是 Shell 關鍵字,expression 表示表達式,pattern 表示匹配模式。

u  expression 既可以是一個變量、一個數字、一個字符串,還可以是一個數學計算表達式,或者是命令的執行結果,只要能夠得到 expression 的值就可以。

u  pattern 可以是一個數字、一個字符串,甚至是一個簡單的正則表達式。

u   可以沒有*)部分。如果 expression 沒有匹配到任何一個模式,那麼就不執行任何操作。

u  除最後一個分支外(這個分支可以是普通分支,也可以是*)分支),其它的每個分支都必須以;;結尾,;;代表一個分支的結束。最後一個分支可以寫;;,也可以不寫。

u  如果不加以說明,Shell 的值都是字符串,expression 和 pattern 也是按照字符串的方式來匹配的。

3.執行過程

       case 會將 expression  的值與 pattern1、pattern2、pattern3 逐個進行匹配:

如果 expression 和某個模式(比如 pattern2)匹配成功,就會執行這模式(比如 pattern2)後面對應的所有語句(該語句可以有一條,也可以有多條),直到遇見雙分號;;才停止;然後整個 case 語句就執行完了,程序會跳出整個 case 語句,執行 esac 後面的其它語句。

       如果 expression 沒有匹配到任何一個模式,那麼就執行*)後面的語句(*表示其它所有值),直到遇見雙分號;;或者esac才結束。*)相當於多個 if 分支語句中最後的 else 部分。

4.case in 支持正則表達式

格式

說明

*

表示任意字符串。

[abc]

表示   a、b、c 三個字符中的任意一個。比如,[15ZH] 表示 1、5、Z、H 四個字符中的任意一個。

[m-n]

表示從 m 到 n 的任意一個字符。比如,[0-9]   表示任意一個數字,[0-9a-zA-Z] 表示字母或數字。

|

表示多重選擇,類似邏輯運算中的或運算。比如,abc | xyz 表示匹配字符串 "abc" 或者 "xyz"。

5.案例1

#!/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

6.案例2

#!/bin/bash

printf "Input a character: "

read -n 1 char

case $char in

    [a-zA-Z])

        printf "\nletter\n"

        ;;

    [0-9])

        printf "\nDigit\n"

        ;;

   [,.?!])

        printf "\nPunctuation\n"

        ;;

    *)

        printf "\nerror\n"

esac


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章