首頁 > shell教程 閱讀:0更新時間:2020-03-28 02:18:28

Shell break和continue跳出循環詳解

使用 while、until、for、select 循環時,如果想提前結束循環(在不滿足結束條件的情況下結束循環),可以使用 break 或者 continue 關鍵字。

在C語言、C++、C#、Python、Java 等大部分編程語言中,break 和 continue 只能跳出當前層次的循環,內層循環中的 break 和 continue 對外層循環不起作用;但是 shell 中的 break 和 continue 卻能夠跳出多層循環,也就是說,內層循環中的 break 和 continue 能夠跳出外層循環。

在實際開發中,break 和 continue 一般只用來跳出當前層次的循環,很少有需要跳出多層循環的情況。

break 關鍵字

Shell break 關鍵字的用法為:

break n

n 表示跳出循環的層數,如果省略 n,則表示跳出當前的整個循環。break 關鍵字通常和 if 語句一起使用,即滿足條件時便跳出循環。

Shell break關鍵字原理示意圖
圖1:Shell break關鍵字原理示意圖
【實例1】不斷從終端讀取用戶輸入的正數,求它們相加的和:
#!/bin/bash

sum=0

while read n; do
    if((n>0)); then
        ((sum+=n))
    else
        break
    fi
done

echo "sum=$sum"
運行結果:
10↙
20↙
30↙
0↙
sum=60

while 循環通過 read 命令的退出狀態來判斷循環條件是否成立,只有當按下 Ctrl+D 組合鍵(表示輸入結束)時,read n才會判斷失敗,此時 while 循環終止。

除了按下 Ctrl+D 組合鍵,你還可以輸入一個小于等于零的整數,這樣會執行 break 語句來終止循環(跳出循環)。

【實例2】使用 break 跳出雙層循環。

如果 break 后面不跟數字的話,表示跳出當前循環,對于有兩層嵌套的循環,就得使用兩個 break 關鍵字。例如,輸出一個 4*4 的矩陣:
#!/bin/bash

i=0
while ((++i)); do  #外層循環
    if((i>4)); then
        break  #跳出外層循環
    fi

    j=0;
    while ((++j)); do  #內層循環
        if((j>4)); then
            break  #跳出內層循環
        fi
        printf "%-4d" $((i*j))
    done

    printf "\n"
done
運行結果:
1   2   3   4  
2   4   6   8  
3   6   9   12 
4   8   12  16 

當 j>4 成立時,執行第二個 break,跳出內層循環;外層循環依然執行,直到 i>4 成立,跳出外層循環。內層循環共執行了 4 次,外層循環共執行了 1 次。

我們也可以在 break 后面跟一個數字,讓它一次性地跳出兩層循環,請看下面的代碼:
#!/bin/bash

i=0
while ((++i)); do  #外層循環
    j=0;
    while ((++j)); do  #內層循環
        if((i>4)); then
            break 2  #跳出內外兩層循環
        fi
        if((j>4)); then
            break  #跳出內層循環
        fi
        printf "%-4d" $((i*j))
    done

    printf "\n"
done
修改后的代碼將所有 break 都移到了內層循環里面。讀者需要重點關注break 2這條語句,它使得程序可以一次性跳出兩層循環,也就是先跳出內層循環,再跳出外層循環。

continue 關鍵字

Shell continue 關鍵字的用法為:

continue n

n 表示循環的層數:
  • 如果省略 n,則表示 continue 只對當前層次的循環語句有效,遇到 continue 會跳過本次循環,忽略本次循環的剩余代碼,直接進入下一次循環。
  • 如果帶上 n,比如 n 的值為 2,那么 continue 對內層和外層循環語句都有效,不但內層會跳過本次循環,外層也會跳過本次循環,其效果相當于內層循環和外層循環同時執行了不帶 n 的 continue。這么說可能有點難以理解,稍后我們通過代碼來演示。

continue 關鍵字也通常和 if 語句一起使用,即滿足條件時便跳出循環。 

Shell continue關鍵字原理示意圖
圖2:Shell continue關鍵字原理示意圖
【實例1】不斷從終端讀取用戶輸入的 100 以內的正數,求它們的和:
#!/bin/bash

sum=0

while read n; do
    if((n<1 || n>100)); then
        continue
    fi
    ((sum+=n))
done

echo "sum=$sum"
運行結果:
10↙
20↙
-1000↙
5↙
9999↙
25↙
sum=60

變量 sum 最終的值為 60,-1000 和 9999 并沒有計算在內,這是因為 -1000 和 9999 不在 1~100 的范圍內,if 判斷條件成立,所以執行了 continue 語句,跳過了當次循環,也就是跳過了((sum+=n))這條語句。

注意,只有按下 Ctrl+D 組合鍵輸入才會結束,read n才會判斷失敗,while 循環才會終止。

【實例2】使用 continue 跳出多層循環,請看下面的代碼:
#!/bin/bash

for((i=1; i<=5; i++)); do
    for((j=1; j<=5; j++)); do
        if((i*j==12)); then
            continue 2
        fi
        printf "%d*%d=%-4d" $i $j $((i*j))
    done
    printf "\n"
done
運行結果:
1*1=1   1*2=2   1*3=3   1*4=4   1*5=5  
2*1=2   2*2=4   2*3=6   2*4=8   2*5=10 
3*1=3   3*2=6   3*3=9   4*1=4   4*2=8   5*1=5   5*2=10  5*3=15  5*4=20  5*5=25
從運行結果可以看出,遇到continue 2時,不但跳過了內層 for 循環,也跳過了外層 for 循環。

break 和 continue 的區別

break 用來結束所有循環,循環語句不再有執行的機會;continue 用來結束本次循環,直接跳到下一次循環,如果循環條件成立,還會繼續循環。

beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。

通俗易懂,深入淺出,一篇文章只講一個知識點。

文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。

文章不涉及代碼,不燒腦細胞,人人都可以學習。

當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!

相關文章

優秀教程

国产亚洲欧美日韩