1. 程式人生 > >shell的流程控制介紹

shell的流程控制介紹

shell、流程控制

Lnux shell和Java、PHP等語言不一樣,它有一套自己的流程控制語句,其中包括條件語句(if,case),循環語句(for,while,until),循環控制語句(continue,break,shift)。下面我會通過一些簡單明了的例子來介紹下各個語句的使用方法。

一、條件語句

1if語句

1)單分支結構

if 判斷條件; then

條件為真的分支代碼

fi

示例:testif1.sh

    #!/bin/bash
    a=5
    if [[ a -gt 4 ]] ;then 
        echo ‘ok‘
    fi


2)雙分支結構

if 判斷條件; then

條件為真的分支代碼

else

條件為假的分支代碼

fi

示例:testif2.sh

    #!/bin/bash
    scores=40
    if [[ $scores -gt 60 ]];then   
         echo "pass"
    else    
         echo "no pass"
    fi

這裏有個要特別註意的一點,就是結尾的fi是if倒過來拼寫,和接下來要介紹的case同樣的用法,case的結尾esac也是case倒過來的拼寫,千萬不要寫錯了,小編在第一次寫腳本的時候就沒註意到這一點,就總是出錯,仔細一檢查腳本原來是結尾符號寫反了,真的很尷尬呀!技術分享然後我就發現了一個減少錯誤的方法:就是在寫條件語句或是循環語句時,首先把語句的格式給寫完,然後再向裏邊添加要實現的語句,這樣就不會忘了寫結尾或是寫反了。其實這也只是我個人的習慣。


3)多分支結構

if 判斷條件1; then

條件為真的分支代碼

elif 判斷條件2; then

條件為真的分支代碼

elif 判斷條件3; then

條件為真的分支代碼

else

以上條件都為假的分支代碼

fi

示例:testif3.sh

    #!/bin/bash
    scores=40
    if [[ $scores -gt 90 ]];then    
        echo "very good!"
    elif [[ $scores -gt 80 ]]; then    
        echo "good!"
    elif [[ $scores -gt 60 ]]; then    
        echo "pass!"
    else    
        echo "no pass!"
    fi

2case語句

case 變量引用 in

PAT1)

分支1;;

PAT2)

分支2;;

......

*)

默認分支;;

esac


case支持glob風格的通配符:

*: 任意長度任意字符

?: 任意單個字符

[]:指定範圍內的任意單個字符

a|b: ab


示例:testcase.sh

    #/bin/bash
    echo "
    本店菜品:
        1.羊肉湯
        2.辣子雞丁米飯
        3.胡辣湯
        4.餃子
        5.拉面
        6.燴面
    read -p "請輸入序號查看價格: " num
    case $num in
    1|4)
        echo "20¥"
        ;;
    3|6)
        echo "10¥"
        ;;
    2|5)
        echo "12¥"
        ;;
    *)
        echo "輸入錯誤"
        ;;
    esac
    unset num

二、循環語句

1for循環

for 變量名 in 列表;do

循環體

done

for ((控制變量初始化;條件判斷表達式;控制變量的修正表達式));do

循環體

done

註意:列表的方式可為:{1..n}、`seq 1 $n` 、/root/bin/*.sh

for循環的執行機制:

依次將列表中的元素賦值給“變量名”; 每次賦值後即執行一次循環體; 直到列表中的元素耗盡,循環結束。

示例:testfor1.sh

    #!/bin/bash
    for i in $(seq 10); do #或 for i in `seq 1  10`; do  
        echo $i
    done

說明:seq字符串只要用空格字符分割,每次for…in 讀取時候,就會按順序將讀到值,給前面的變量。

示例:testfor2.sh,這種格式類似於c語言格式,學過編程的應該都能看懂的。技術分享

    #!/bin/bash
    for((i=1;i<=10;i++));do    
        echo $i
    done

2、while循環

while循環用於不斷執行一系列命令,也用於從輸入文件中讀取數據;命令通常為測試條件。其格式為:

while CONDITION; do

循環體

done

CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之後會再次做判斷;條件為“true”,則執行一次循環;直到條件測試狀態為“false”終止循環。因此:CONDTION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正。

進入條件:CONDITION為true

退出條件CONDITION為false

示例:testwhile1.sh

    #!/bin/bash
    i=10;
    while [[ $i -gt 5 ]];do
        echo $i
        let i--
    done

運行結果:==============================

testwhile1.sh
10
9
8
7
6

這裏使用了 Bash let 命令,它用於執行一個或多個表達式,變量計算中不需要加上 $ 來表示變量,具體可查閱:Bash let 命令

示例:testwhile2.sh(循環讀取文件中的內容)

    #!/bin/bash
    while read line;do   
         echo $line
    done < /etc/passwd

while循環還可用於讀取鍵盤信息。下面的例子中,輸入信息被設置為變量FILM,按<Ctrl-D>結束循環。

示例:testwhile3.sh

    #!/bin/bash
    echo ‘按下 <CTRL-D> 退出‘
    echo -n ‘輸入你最喜歡的網站名: ‘                                                
    while read FILM
    do
        echo "是的!$FILM 是一個好網站"
    done

運行結果:==============================

[[email protected] shell]#bash whileread1.sh

按下 <CTRL-D> 退出

輸入你最喜歡的網站名: 菜鳥教程

是的!菜鳥教程 是一個好網站

while無限循環:

    while true(:); do
        循環體
    done

3、until循環

until CONDITION; do

循環體

done

意思是:直到滿足條件,就退出。否則執行循環體的內容。

進入條件:CONDITION為false

退出條件CONDITION為true

until語句的執行正好和while相反,其實在平常寫腳本時,小編還是比較喜歡用while,感覺用著特別順手。

示例:testuntil.sh

    #!/bin/bash
    a=10
    until [[ $a -lt 0 ]];do
        echo $a
        let a--
    done

until無限循環:

    until false; do
        循環體
    done


三、循環控制語句

在循環過程中,有時候需要在未達到循環結束條件時強制跳出循環,Shell使用兩個命令來實現該功能:continuebreak

1、continue,主要用於循環體中

continue [N]:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為1層。

continue 不會跳出所有循環,僅僅跳出當前循環。

while CONDTIITON1; do

CMD1

...

if CONDITION2; then

continue

fi

CMDn

...

done

示例:testcontinue.sh

    #!/bin/bash
    while true ;do
    read -p "輸入 1 到 5 之間的數字: " aNum
    case $aNum in
        1|2|3|4|5)
                echo "你輸入的數字為 $aNum!"
                ;;
        *)
                echo "你輸入的數字不是 1 到 5 之間的!"
                continue
                echo "遊戲結束"
                ;;                                                              
    esac
    done

運行結果:===================================

[[email protected] bin]#testcontinue.sh

輸入 1 到 5 之間的數字: 2

你輸入的數字為 2!

輸入 1 到 5 之間的數字: 7

你輸入的數字不是 1 到 5 之間的!

輸入 1 到 5 之間的數字: 3

你輸入的數字為 3!

2、break

break [N]:提前結束第N層循環,最內層為第1層。

break命令允許跳出所有循環,下面的例子中,腳本進入死循環直至用戶輸入數字大於5。要跳出這個循環,返回到shell提示符下,需要使用break命令。

while CONDTIITON1; do

CMD1

...

if CONDITION2; then

break

fi

CMDn

...

done

示例:testbreak.sh

    #!/bin/bash
    while true;do                                                                   
    read -p "輸入 1 到 5 之間的數字:" aNum
    case $aNum in
        1|2|3|4|5) 
                echo "你輸入的數字為 $aNum!"
                ;;
        *)
                 echo "你輸入的數字不是 1 到 5 之間的! 遊戲結束"
                 break
                 ;;
    esac
    done

運行結果:====================================

[[email protected] bin]#testbreak.sh

輸入 1 到 5 之間的數字:2

你輸入的數字為 2!

輸入 1 到 5 之間的數字:7

你輸入的數字不是 1 到 5 之間的! 遊戲結束

結合上邊兩個例子,我們可以看出:在continue循環中,如果輸入的不是1~5之間的數字,就會繼續運行腳本重新輸入,而不是退出腳本,相當於進入了死循環,因此,echo "遊戲結束"這行代碼永遠就不會被執行;而在break循環中,如果輸入的不是1~5之間的數字,就會跳出循環,退出腳本。

3shift

用於將量列表list 左移指定次數,缺省為左移一次。v

參量列表list 一旦被移動,最左端的那個參數就從列表中刪除。while 循環遍歷位置參量列表時,常用到shift

示例:./doit.sh a b c d e f g h

    #!/bin/bash
    while [ $# -gt 0 ] # or (( $# > 0 ));do
        echo $*
        shift
    done

./shfit.sh a b c d e f g h

    #!/bin/bash
    until [ -z "$1" ] ;do
        echo "$1"
    shift
    done
    echo


最後還有一個不太常用的工具:select

select 循環主要用於創建菜單,按數字順序排列的菜單項將顯示在標準錯誤上,並顯示PS3 提示符,等待用戶輸入。用戶輸入被保存在內置變量 REPLY 中。

select 是個無限循環,因此要記住用break 命令退出循環,或用exit 命令終止腳本。也可以按ctrl+c 退出循環。格式如下:

select variable in list

do

循環體命令

done

示例:testselect.sh

    #/bin/bash
    PS3="請選擇菜單:"
    select menu in 羊肉湯 辣子雞丁 米飯 胡辣湯 餃子 拉面 燴面;do
    case $REPLY in
    1|4)
        echo "20¥"
        ;;
    3|6)
        echo "10¥"
        ;;
    2|5)
        echo "12¥"
        ;;
    7)
        break
        ;;
    *)
        echo "輸入錯誤"
        ;;
    esac





shell的流程控制介紹