1. 程式人生 > >Linux shell腳本流程控制

Linux shell腳本流程控制

linux 循環 選擇

博主搬家至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: ab

經典實例解析:

根據輸入的分數來判斷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腳本流程控制