1 if 分支語句
在 Shell 腳本應用中,if 語句是最為常用的一種流程控制方式,用來根據特定的條件測試結果,分別執行不同的操作。
根據不同的復雜程度,if 語句的選擇結構可以分為三種基本類型,適用于不同的應用場合:
單分支 if 語句
雙分支 if 語句
多分支 if 語句
1.1 單分支if語句
對于單分支的選擇結構,只有在“條件成立”時才會執行相應的代碼,否則不執行任何操作。
- 語法:
if 條件測試語句
then
命令序列
fi
條件測試語句既可以是“[條件表達式]”語句,也可以是其他可執行的命令語句。
命令序列指的是一條或多條可執行的命令行,也包括嵌套使用的 if 語句或其他流程控制語句。
- 單分支 if 語句的執行流程:
首先判斷條件測試操作的結果,如果返回值為 0,表示條件成立,執行 then 后面的命令序列,一直到遇見 fi 結束判斷為止,繼續執行其他腳本代碼。
如果返回值不為 0,則忽略 then 后面的命令序列,直接跳至 fi 行以后執行其他腳本代碼。
- 示例1
#!/bin/bash
read -p "請輸入一個數字:" num
if [ $num -gt 5 ]
thenecho "$num 大于 5"
fi
# 也可以寫成
if [ $num -gt 5 ];then echo "$num 大于 5";fi
# 或者
[ $num -gt 5 ] && echo "$num 大于 5"
- 示例2
if [ "$USER" != "root" ]
thenecho "當前用戶不是root用戶,權限不足"exit 3
fi
ls
exit命令表示退出腳本,不再執行其它代碼
3表示退出后的返回狀態值
1.2 雙分支if語句
對于雙分支的選擇結構,要求針對“條件成立”“條件不成立”兩種情況分別執行不同的操作。
- 語法
if 條件測試語句
then
命令序列1
else
命令序列2
fi
- 雙分支 if 語句的執行流程
首先判斷條件測試語句的結果,如果條件成立,則執行then后面的命令序列 1,忽略 else 及后面的命令序列 2,直到遇見 fi 結束判斷。
如果條件不成立,則忽略 then 及后面的命令序列 1,直接跳至 else 后面的命令序列 2 并執行,直到遇見 fi 結束判斷。
- 示例
#!/bin/bash
read -p "請輸入一個數字num1:" num1
read -p "請輸入一個數字num2:" num2
if [ $num1 -lt $num2 ]
thenecho "$num1 $num2"
elseecho "$num2 $num1"
fi
# 通過位置參數 $1 提供目標主機地址
ping $1 -c 4 -i 0.2 &>/dev/null
if [ $? -eq 0 ]
thenecho "$host連接成功"
elseecho "$host連接失敗"
fi
-c 和 -i:分別表示發送測試包的個數和時間間隔
&>/dev/null:將ping執行過程中的輸出信息丟棄
1.3 多分支if語句
- 語法
if 條件測試語句1
then
命令序列1
elif 條件測試語句2 # 可以有n個
then
命令序列2
else
命令序列2
fi
多分支 if 語句的執行流程:
首先判斷條件測試語句 1 的結果,如果條件 1 成立,則執行命令序列 1,然后跳至 fi 結束判斷。
如果條件 1 不成立,則繼續判斷條件測試語句 2 的結果,如果條件 2 成立,則執行命令序列 2,然后跳至 fi結束判斷…
如果所有的條件都不滿足,則執行 else 后面的命令序列n,直到遇見 fi 結束判斷。
- 示例
#!/bin/bash
read -p "請輸入成績:" source
if [ $source -ge 0 ] && [ $source -lt 60 ]
thenecho "成績不合格"
elif [ $source -ge 60 ] && [ $source -lt 75 ]
thenecho "成績合格"
elif [ $source -ge 75 ] && [ $source -lt 90 ]
thenecho "成績良好"
elif [ $source -ge 90 ] && [ $source -lt 100 ]
thenecho "成績優秀"
elif [ $source -eq 100 ]
thenecho "滿分"
elseecho "輸入錯誤"
fi
2 case分支語句
針對變量額不同取值,分別執行不同的命令序列這種情況與多分支的if語句非常相似,只不過if語句需要判斷多個不同的條件,而case語句只是判斷一個變量的不同取值。
- 語法
case 變量值 in模式1)命令序列1;;模式2)命令序列2;;......*)默認命令序列;;
esac
變量值,即$變量名
*作為通配符,可匹配任意值
- case 語句的執行流程:
首先使用“變量值”與模式 1 進行比較,若取值相同則執行模式 1后的命令序列,直到遇見雙分號“;;”后跳轉至esac,表示結束分支。
若與模式 1 不相匹配,則繼續與模式 2 進行比較,若取值相同則執行模式 2 后的命令序列,直到遇見雙分號“;;”后跳轉至 esac,表示結束分支……依此類推。
若找不到任何匹配的值,則執行默認模式“*)” 后的命令序列,直到遇見 esac 后結束分支。
- 注意
雙分號“;;”表示命令序列的結束。
模式字符串中,可以用方括號表示一個連續的范圍,如“[0-9]”;還可以用“|”表示或,如“A|B”。
- 示例
#!/bin/bash
read -p "請輸入月份:" month
case $month in1|3|5|[7-8]|10|12)echo "$month月有31天";;2)read -p "請輸入年份:" yearif [ $(echo $year%4|bc) -eq 0 ] && [ $(echo $year%100|bc) -ne 0 ] || [ $(echo $year%400|bc) -eq 0 ]thenecho "$year年的$month月有29天"elseecho "$year年的$month月有28天"fi;;4|6|9|11)echo "$month月有30天";;*)echo "月份輸入錯誤"
esac