9.Scripts
本章同步視頻:https://edu.51cto.com/sd/e4874
9.4 選擇結構
9.4.1 利用 if .... then
condition是判斷條件,如果 condition 成立(返回“真”),那麼 then 後邊的語句將會被執行;如果 condition 不成立(返回“假”),那麼不會執行任何語句。
注意,最後必須以fi來閉合,fi 就是 if 倒過來拼寫。也正是有了 fi 來結尾,所以即使有多條語句也不需要用{ }包圍起來。
[root@localhost tmp]# vim 1.sh
注意 condition 後邊的分號;,當 if 和 then 位於同一行的時候,這個分號是必須的,否則會有語法錯誤。
[root@localhost tmp]# vim 1.sh
[root@localhost tmp]# vim 1.sh
read -p "Please input (Y/N): " yn
if [ "${yn}" == "Y" ] || [ "${yn}" == "y" ]; then
if [ "${yn}" == "N" ] || [ "${yn}" == "n" ]; then
echo "I don't know what your choice is" && exit 0
I don't know what your choice is
如果 condition 成立,那麼 then 後邊的 statement1 語句將會被執行;否則,執行 else 後邊的 statement2 語句。
[root@localhost tmp]# vim 1.sh
如果 condition1 成立,那麼就執行 if 後邊的 statement1;如果 condition1 不成立,那麼繼續執行 elif,判斷 condition2。
如果 condition2 成立,那麼就執行 statement2;如果 condition2 不成立,那麼繼續執行後邊的 elif,判斷 condition3。
如果 condition3 成立,那麼就執行 statement3;如果 condition3 不成立,那麼繼續執行後邊的 elif。
如果所有的 if 和 elif 判斷都不成立,就進入最後的 else,執行 statementn。
[root@localhost tmp]# vim 1.sh
if [ "${1}" == "hello" ]; then
echo "You MUST input parameters, ex> {${0} someword}"
echo "The only parameter is 'hello', ex> {${0} hello}"
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
printf "Input integer number: "
if test $num -eq 1 ; then #第一種條件寫法
elif [ $num -eq 2 ] ; then #第二種條件寫法
elif [[ $num -eq 3 ]]; then #第三種條件寫法
elif ((num==4)); then #第四種條件寫法
elif ((num==5)); then #第四種僅限數值用法
9.4.2 利用 case ..... esac 判斷
u case、in 和 esac 都是 Shell 關鍵字,expression 表示表達式,pattern 表示匹配模式。
u expression 既可以是一個變量、一個數字、一個字符串,還可以是一個數學計算表達式,或者是命令的執行結果,只要能夠得到 expression 的值就可以。
u pattern 可以是一個數字、一個字符串,甚至是一個簡單的正則表達式。
u 可以沒有*)部分。如果 expression 沒有匹配到任何一個模式,那麼就不執行任何操作。
u 除最後一個分支外(這個分支可以是普通分支,也可以是*)分支),其它的每個分支都必須以;;結尾,;;代表一個分支的結束。最後一個分支可以寫;;,也可以不寫。
u 如果不加以說明,Shell 的值都是字符串,expression 和 pattern 也是按照字符串的方式來匹配的。
case 會將 expression 的值與 pattern1、pattern2、pattern3 逐個進行匹配:
如果 expression 和某個模式(比如 pattern2)匹配成功,就會執行這模式(比如 pattern2)後面對應的所有語句(該語句可以有一條,也可以有多條),直到遇見雙分號;;才停止;然後整個 case 語句就執行完了,程序會跳出整個 case 語句,執行 esac 後面的其它語句。
如果 expression 沒有匹配到任何一個模式,那麼就執行*)後面的語句(*表示其它所有值),直到遇見雙分號;;或者esac才結束。*)相當於多個 if 分支語句中最後的 else 部分。
格式 | 說明 |
* | 表示任意字符串。 |
[abc] | 表示 a、b、c 三個字符中的任意一個。比如,[15ZH] 表示 1、5、Z、H 四個字符中的任意一個。 |
[m-n] | 表示從 m 到 n 的任意一個字符。比如,[0-9] 表示任意一個數字,[0-9a-zA-Z] 表示字母或數字。 |
| | 表示多重選擇,類似邏輯運算中的或運算。比如,abc | xyz 表示匹配字符串 "abc" 或者 "xyz"。 |
printf "Input integer number: "