新聞中心

創(chuàng)新互聯(lián)公司是一家專業(yè)提供奉化企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、成都網(wǎng)站建設(shè)、H5建站、小程序制作等業(yè)務(wù)。10年已為奉化眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
在C語(yǔ)言、C++、C#、Python、Java 等大部分編程語(yǔ)言中,break 和 continue 只能跳出當(dāng)前層次的循環(huán),內(nèi)層循環(huán)中的 break 和 continue 對(duì)外層循環(huán)不起作用;但是 Shell 中的 break 和 continue 卻能夠跳出多層循環(huán),也就是說(shuō),內(nèi)層循環(huán)中的 break 和 continue 能夠跳出外層循環(huán)。
在實(shí)際開發(fā)中,break 和 continue 一般只用來(lái)跳出當(dāng)前層次的循環(huán),很少有需要跳出多層循環(huán)的情況。
break 關(guān)鍵字
Shell break 關(guān)鍵字的用法為:
break n
n 表示跳出循環(huán)的層數(shù),如果省略 n,則表示跳出當(dāng)前的整個(gè)循環(huán)。break 關(guān)鍵字通常和 if 語(yǔ)句一起使用,即滿足條件時(shí)便跳出循環(huán)。
圖1:Shell break關(guān)鍵字原理示意圖
【實(shí)例1】不斷從終端讀取用戶輸入的正數(shù),求它們相加的和:
#!/bin/bash
sum=0
while read n; do
if((n>0)); then
((sum+=n))
else
break
fi
done
echo "sum=$sum"
運(yùn)行結(jié)果:
10↙
20↙
30↙
0↙
sum=60
while 循環(huán)通過(guò) read 命令的退出狀態(tài)來(lái)判斷循環(huán)條件是否成立,只有當(dāng)按下 Ctrl+D 組合鍵(表示輸入結(jié)束)時(shí),
read n才會(huì)判斷失敗,此時(shí) while 循環(huán)終止。
除了按下 Ctrl+D 組合鍵,你還可以輸入一個(gè)小于等于零的整數(shù),這樣會(huì)執(zhí)行 break 語(yǔ)句來(lái)終止循環(huán)(跳出循環(huán))。
【實(shí)例2】使用 break 跳出雙層循環(huán)。
如果 break 后面不跟數(shù)字的話,表示跳出當(dāng)前循環(huán),對(duì)于有兩層嵌套的循環(huán),就得使用兩個(gè) break 關(guān)鍵字。例如,輸出一個(gè) 4*4 的矩陣:
#!/bin/bash
i=0
while ((++i)); do #外層循環(huán)
if((i>4)); then
break #跳出外層循環(huán)
fi
j=0;
while ((++j)); do #內(nèi)層循環(huán)
if((j>4)); then
break #跳出內(nèi)層循環(huán)
fi
printf "%-4d" $((i*j))
done
printf "\n"
done
運(yùn)行結(jié)果:
1 2 3 4 2 4 6 8 3 6 9 12 4 8 12 16
當(dāng) j>4 成立時(shí),執(zhí)行第二個(gè) break,跳出內(nèi)層循環(huán);外層循環(huán)依然執(zhí)行,直到 i>4 成立,跳出外層循環(huán)。內(nèi)層循環(huán)共執(zhí)行了 4 次,外層循環(huán)共執(zhí)行了 1 次。
我們也可以在 break 后面跟一個(gè)數(shù)字,讓它一次性地跳出兩層循環(huán),請(qǐng)看下面的代碼:
#!/bin/bash
i=0
while ((++i)); do #外層循環(huán)
j=0;
while ((++j)); do #內(nèi)層循環(huán)
if((i>4)); then
break 2 #跳出內(nèi)外兩層循環(huán)
fi
if((j>4)); then
break #跳出內(nèi)層循環(huán)
fi
printf "%-4d" $((i*j))
done
printf "\n"
done
修改后的代碼將所有 break 都移到了內(nèi)層循環(huán)里面。讀者需要重點(diǎn)關(guān)注
break 2這條語(yǔ)句,它使得程序可以一次性跳出兩層循環(huán),也就是先跳出內(nèi)層循環(huán),再跳出外層循環(huán)。
continue 關(guān)鍵字
Shell continue 關(guān)鍵字的用法為:
continue n
n 表示循環(huán)的層數(shù):
- 如果省略 n,則表示 continue 只對(duì)當(dāng)前層次的循環(huán)語(yǔ)句有效,遇到 continue 會(huì)跳過(guò)本次循環(huán),忽略本次循環(huán)的剩余代碼,直接進(jìn)入下一次循環(huán)。
- 如果帶上 n,比如 n 的值為 2,那么 continue 對(duì)內(nèi)層和外層循環(huán)語(yǔ)句都有效,不但內(nèi)層會(huì)跳過(guò)本次循環(huán),外層也會(huì)跳過(guò)本次循環(huán),其效果相當(dāng)于內(nèi)層循環(huán)和外層循環(huán)同時(shí)執(zhí)行了不帶 n 的 continue。這么說(shuō)可能有點(diǎn)難以理解,稍后我們通過(guò)代碼來(lái)演示。
continue 關(guān)鍵字也通常和 if 語(yǔ)句一起使用,即滿足條件時(shí)便跳出循環(huán)。
圖2:Shell continue關(guān)鍵字原理示意圖
【實(shí)例1】不斷從終端讀取用戶輸入的 100 以內(nèi)的正數(shù),求它們的和:
#!/bin/bash
sum=0
while read n; do
if((n<1 || n>100)); then
continue
fi
((sum+=n))
done
echo "sum=$sum"
運(yùn)行結(jié)果:
10↙
20↙
-1000↙
5↙
9999↙
25↙
sum=60
變量 sum 最終的值為 60,-1000 和 9999 并沒(méi)有計(jì)算在內(nèi),這是因?yàn)?-1000 和 9999 不在 1~100 的范圍內(nèi),if 判斷條件成立,所以執(zhí)行了 continue 語(yǔ)句,跳過(guò)了當(dāng)次循環(huán),也就是跳過(guò)了
((sum+=n))這條語(yǔ)句。
注意,只有按下 Ctrl+D 組合鍵輸入才會(huì)結(jié)束,
read n才會(huì)判斷失敗,while 循環(huán)才會(huì)終止。
【實(shí)例2】使用 continue 跳出多層循環(huán),請(qǐng)看下面的代碼:
#!/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
運(yùn)行結(jié)果:
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
從運(yùn)行結(jié)果可以看出,遇到
continue 2時(shí),不但跳過(guò)了內(nèi)層 for 循環(huán),也跳過(guò)了外層 for 循環(huán)。
break 和 continue 的區(qū)別
break 用來(lái)結(jié)束所有循環(huán),循環(huán)語(yǔ)句不再有執(zhí)行的機(jī)會(huì);continue 用來(lái)結(jié)束本次循環(huán),直接跳到下一次循環(huán),如果循環(huán)條件成立,還會(huì)繼續(xù)循環(huán)。
本文題目:Shellbreak和continue跳出循環(huán)詳解
網(wǎng)頁(yè)地址:http://fisionsoft.com.cn/article/cccieep.html


咨詢
建站咨詢
