Linux shell腳本流程控制
博主搬家至51CTO,初來乍到,請多指教。
此次我們來通過實例解析Linux shell腳本流程控制
Linux shell腳本流程控制可分為三類:順序執行,條件選擇執行,循環執行
順序執行:簡單理解就是逐行執行腳本內容,逐行解讀,逐行執行。(此處不做實例解析)
條件選擇執行:可以理解為先進行某一條件的判斷選擇,再決定執行怎樣的腳本內容。常見語句if case
條件選擇語句:if
if語句用法:
單分支
if 判斷條件;then
條件為真的分支代碼
fi
雙分支
if 判斷條件; then
條件為真的分支代碼
else
條件為假的分支代碼
fi
多分支
if 判斷條件 1 ; then
條件為真的分支代碼
elif 判斷條件 2 ; then
條件為真的分支代碼
elif 判斷條件 3 ; then
條件為真的分支代碼
else
以上條件都為假的分支代碼
fi
註意:if語句支持嵌套,逐個條件進行判斷,第一次遇為“真”條件時,執行其分支,而後結束整個if判斷,否則的話向後進行判斷。
經典實例解析:
根據輸入的分數來判斷ABCD等
#提示用戶輸入分數 read -p "please input your score : " score #判斷用戶輸入是否有誤 [[ $score =~ ^[0-9]{1,2}$ ]] || { echo "your input wrong" ; exit; } #if判斷 if [ $score -gt 90 ]; then #首先判斷分數是否大於90 echo "A" #大於90的話執行 elif [ $score -gt 70 ]; then #不大於90,接著判斷是否大於70 echo "B" #大於70小於90的話執行 elif [ $score -gt 60 ]; then #不大於70,接著判斷是否大於60 echo "C" #大於60小於70的話執行 else #判斷條件都不滿足:小於60的話執行 echo "D" fi #變量刪除 unset score
條件判斷語句:case
case語句用法:
case 變量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默認分支
;;
esac
註意:case的變量引用,用$引用某變量。
case 支持glob 風格的通配符:
*: 任意長度任意字符 ?: 任意單個字符
[] :指定範圍內的任意單個字符 a|b: a或b
經典實例解析:
根據輸入的分數來判斷ABCD等
read -p "please input your score : " score [[ $score =~ ^[0-9]{1,2}$ ]] || { echo "your input wrong" ; exit; } #case選擇 case $score in #case開頭,引用變量 in 9?) #支持通配符:判斷變量值為9X的話,執行該分支內容 echo "A" ;; 7?|8?) #判斷變量值為7X或8X的話,執行該分支內容,也可寫為[78]?) echo "B" ;; 6?) #判斷變量值為6X的話,執行該分支內容 echo "C" ;; *) #如果變量值不符合上述所有的判斷,執行該分支內容 echo "D" ;; esac #以case的反序esac結束 unset score
循環執行:根據條件循環執行X次某一部分腳本內容(循環體)。常見循環語句for while until
循環語句:for(有兩種用法)
for語句用法:
for 變量名 in 列表;do
循環體
done
註意:依次將列表中的元素賦值給“變量名”,每次賦值後即執行一次循環體,直到列表中的元素耗盡,循環結束。
列表生成方式:
(1) 直接給出列表
(2) 整數列表:(a) {start..end}或者(b) $(seq[start [step]] end)
(3) 返回列表的命令$(COMMAND)或者``
(4) 使用glob,如:*.sh
(5) 變量引用,如:[email protected],$*
for (( 控制變量初始化; 條件判斷表達式; 控制變量的修正表達式))
do
循環體
done
解釋:常用於數字循環。實現類似於C語言風格的操作
控制變量初始化:僅在運行到循環代碼段時執行一次
控制變量的修正表達式:每輪循環結束會先進行控制變量修正運算,而後再做條件判斷
經典實例解析:
計算1到輸入數字的所有值(1+2+...+X)的總和
#for語句用法1 read -p "請輸入一個數字: " int if `echo $int | grep "^[0-9]\+\b" &> /dev/null` ; then #判斷用戶輸入是否為數字 sum=0 for i in $(seq $int) ; do #將seq $int的執行結果作為列表循環可以寫為`seq $int` let sum+=$i #執行循環體內容,列表未結束的話,接著循環。 done #do與done配套使用do開始,done結束循環。 echo "總和為:$sum" else echo "不要調皮,請輸入數字" fi
#for語句用法2 read -p "請輸入一個數字: " int if `echo $int | grep "^[0-9]\+\b" &> /dev/null` ; then for ((i=0,sum=0;i<=$int;i++)) ;do #定義初始值,判斷表達式,變量的修正 let sum+=$i done echo $sum else echo "不要調皮,請輸入數字" fi
循環語句:while
while語句的用法:
while CONDITION; do
循環體
done
解釋:CONDITION :循環控制條件;進入循環之前,先做一次判斷;每一次循環之後會再次做判斷;條件為“true”,則執行一次循環;直到條件測試狀態為“false”終止循環。
因此:CONDTION 一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正。
進入條件:CONDITION 為true
退出條件:CONDITION 為false
經典實例解析:
計算1到輸入數字的所有值(1+2+...+X)的總和
read -p "請輸入一個數字: " int if `echo $int | grep "^[0-9]\+\b" &> /dev/null` ; then sum=0 while [ 0 -lt $int ] ; do #判斷為真時,循環循環體,為假時退出循環。 let sum+=$int let int-- done echo "$sum" else echo "不要調皮,請輸入數字" fi
while循環的特殊用法(遍歷文件的每一行):
while read line; do
循環體
done < /PATH/FROM/SOMEFILE
解釋:依次讀取/PATH/FROM/SOMEFILE 文件中的每一行,且將行賦值給變量line
經典實例解析:
計算1到輸入數字的所有值(1+2+...+X)的總和
>line.txt #清空文件 read -p "請輸入一個數字: " int if `echo $int | grep "^[0-9]\+\b" &> /dev/null` ; then seq $int > /shell/line.txt #將數字每個數字一行導入文件 sum=0 while read line ;do #讀取每一行即數字,賦值給變量 let sum+=$line done < /shell/line.txt echo "$sum" else echo "不要調皮,請輸入數字" fi
循環語句:until
until循環用法與while循環一樣,只是循環判斷相反,while循環,當條件為真時執行循環體,為假時退出,而until循環,當條件為假時執行循環體,條件為真時退出。
經典實例解析:
計算1到輸入數字的所有值(1+2+...+X)的總和
#將while示例中的while [ 0 -lt $int ] ; do 改為until [ 0 -gt $int ] ; do 註意兩者的區別以及轉換
循環控制語句:作用於循環體,用來控制滿足某一條件的循環執行。常見控制語句:continue break shift
continue語句:continue [n]跳過滿足條件的某一層執行操作,繼續進行下一次判斷,最內層循環為第1層。依次類推。
經典實例解析:
計算1到100的值的總和(編)
for ((i=0,sum=0;i<=100;i++)) ; do [ $i -eq 50 ] && continue #當變量i為50時,跳過計算50,執行下一個計算 let sum+=$i done echo "$sum" #最後輸出結果為5000
break語句:break [n]滿足某一條件直接結束某一層循環,不進行下一次的判斷,最內層循環為第1層,依次類推。
經典實例解析:
計算1到100的值的總和(編)
# 將continue示例中的continue改為break,即當變量i為50時,結束後續循環的執行 #最後輸出結果為1225
shift語句:shift [n]常用於將位置參量列表左移指定次數,默認為左移一次,最左端的參數將被刪除
經典實例解析:
[ $# -eq 0 ] && echo "please input args...." #判斷腳本後面是否接參數 while [ $# -ne 0 ] ; do echo "[email protected]" shift #左移一個參數,該參數將被刪除 done 腳本運行結果: [[email protected] shell]#shift.sh 1 2 3 4 1 2 3 4 2 3 4 3 4 4
本文出自 “Mozart” 博客,請務必保留此出處http://mozart.blog.51cto.com/13286673/1965895
Linux shell腳本流程控制