博主搬家至51CTO,初來乍到,請多指教。shell
這次咱們來經過實例解析Linux shell腳本流程控制bash
Linux shell腳本流程控制可分爲三類:順序執行,條件選擇執行,循環執行ide
順序執行:簡單理解就是逐行執行腳本內容,逐行解讀,逐行執行。(此處不作實例解析)測試
條件選擇執行:能夠理解爲先進行某一條件的判斷選擇,再決定執行怎樣的腳本內容。常見語句if casespa
條件選擇語句:iform
if語句用法:input
單分支it
if 判斷條件;thenclass
條件爲真的分支代碼變量
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) 變量引用,如:$@,$*
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 "$@" shift #左移一個參數,該參數將被刪除 done 腳本運行結果: [root@localhost shell]#shift.sh 1 2 3 4 1 2 3 4 2 3 4 3 4 4