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 一般只用來跳出當前層次的循環,很少有需要跳出多層循環的情況。

圖1:Shell break關鍵字原理示意圖
【實例1】不斷從終端讀取用戶輸入的正數,求它們相加的和:
10↙
20↙
30↙
0↙
sum=60
while 循環通過 read 命令的退出狀態來判斷循環條件是否成立,只有當按下 Ctrl+D 組合鍵(表示輸入結束)時,
除了按下 Ctrl+D 組合鍵,你還可以輸入一個小于等于零的整數,這樣會執行 break 語句來終止循環(跳出循環)。
【實例2】使用 break 跳出雙層循環。
如果 break 后面不跟數字的話,表示跳出當前循環,對于有兩層嵌套的循環,就得使用兩個 break 關鍵字。例如,輸出一個 4*4 的矩陣:
當 j>4 成立時,執行第二個 break,跳出內層循環;外層循環依然執行,直到 i>4 成立,跳出外層循環。內層循環共執行了 4 次,外層循環共執行了 1 次。
我們也可以在 break 后面跟一個數字,讓它一次性地跳出兩層循環,請看下面的代碼:
continue 關鍵字也通常和 if 語句一起使用,即滿足條件時便跳出循環。

圖2:Shell continue關鍵字原理示意圖
【實例1】不斷從終端讀取用戶輸入的 100 以內的正數,求它們的和:
10↙
20↙
-1000↙
5↙
9999↙
25↙
sum=60
變量 sum 最終的值為 60,-1000 和 9999 并沒有計算在內,這是因為 -1000 和 9999 不在 1~100 的范圍內,if 判斷條件成立,所以執行了 continue 語句,跳過了當次循環,也就是跳過了
注意,只有按下 Ctrl+D 組合鍵輸入才會結束,
【實例2】使用 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 語句一起使用,即滿足條件時便跳出循環。
圖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 語句一起使用,即滿足條件時便跳出循環。

圖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%的其他從業者!