控制循環(huán)

本篇內(nèi)容均摘自《Linux命令行與shell腳本編程大全》绢记,個人認(rèn)為需要重點學(xué)習(xí)的章節(jié)。【免費】Linux命令行與Shell腳本編程大全 第3版 PDF全本 21MB 百度網(wǎng)盤下載 - 今夕是何夕 - 博客園
你可能會想爽蝴,一旦啟動了循環(huán)痴昧,就必須苦等到循環(huán)完成所有的迭代。并不是這樣的澜建。有兩個命令能幫我們控制循環(huán)內(nèi)部的情況:
1.break命令
2.continue命令
每個命令在如何控制循環(huán)的執(zhí)行方面有不同的用法向挖。下面幾節(jié)將介紹如何使用這些命令來控制循環(huán)。
13.7.1 break 命令
break命令是退出循環(huán)的一個簡單方法炕舵『沃可以用break命令來退出任意類型的循環(huán),包括while和until循環(huán)咽筋。
有幾種情況可以使用break命令:

  1. 跳出單個循環(huán)
    在shell執(zhí)行break命令時溶推,它會嘗試跳出當(dāng)前正在執(zhí)行的循環(huán):
$ cat test17
#!/bin/bash
for var1 in 1 2 3 4 5 6 7 8 9 10
do
    if [ $var1 -eq 5 ]
    then
    break
    fi
echo "Iteration number: $var1"
done
  echo "The for loop is completed"
$ ./test17
Iteration number: 1
Iteration number: 2
Iteration number: 3
Iteration number: 4
The for loop is completed

for循環(huán)通常都會遍歷列表中指定的所有值。但當(dāng)滿足if-then的條件時奸攻, shell會執(zhí)行break命令蒜危,停止for循環(huán)。
這種方法同樣適用于while和until循環(huán):

$ cat test18
#!/bin/bash
var1=1
while [ $var1 -lt 10 ]
do
  if [ $var1 -eq 5 ]
  then
    break
  fi
  echo "Iteration: $var1"
  var1=$[ $var1 + 1 ]
done
echo "The while loop is completed"
$ ./test18
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4
The while loop is completed

while循環(huán)會在if-then的條件滿足時執(zhí)行break命令睹耐,終止辐赞。

  1. 跳出內(nèi)部循環(huán)
    在處理多個循環(huán)時, break命令會自動終止你所在的最內(nèi)層的循環(huán)硝训。
$ cat test19
#!/bin/bash
for (( a = 1; a < 4; a++ ))
do
  echo "Outer loop: $a"
  for (( b = 1; b < 100; b++ ))
  do
    if [ $b -eq 5 ]
    then
      break
    fi
    echo "  Inner loop: $b"
  done
done
$ ./test19
Outer loop: 1
  Inner loop: 1
  Inner loop: 2
  Inner loop: 3
  Inner loop: 4
Outer loop: 2
  Inner loop: 1
  Inner loop: 2
  Inner loop: 3
  Inner loop: 4
Outer loop: 3
  Inner loop: 1
  Inner loop: 2
  Inner loop: 3
  Inner loop: 4

內(nèi)部循環(huán)里的for語句指明當(dāng)變量b等于100時停止迭代响委。但內(nèi)部循環(huán)的if-then語句指明當(dāng)變量b的值等于5時執(zhí)行break命令。注意窖梁,即使內(nèi)部循環(huán)通過break命令終止了晃酒,外部循環(huán)依然繼續(xù)執(zhí)行。

  1. 跳出外部循環(huán)
    有時你在內(nèi)部循環(huán)窄绒,但需要停止外部循環(huán)贝次。 break命令接受單個命令行參數(shù)值:
    break n
    其中n指定了要跳出的循環(huán)層級。默認(rèn)情況下彰导, n為1蛔翅,表明跳出的是當(dāng)前的循環(huán)。如果你將n設(shè)為2位谋, break命令就會停止下一級的外部循環(huán)山析。
$ cat test20
#!/bin/bash
for (( a = 1; a < 4; a++ ))
do
  echo "Outer loop: $a"
    for (( b = 1; b < 100; b++ ))
    do
      if [ $b -gt 4 ]
      then
        break 2
      fi
    echo " Inner loop: $b"
    done
done
$ ./test20
Outer loop: 1
Inner loop: 1
Inner loop: 2
Inner loop: 3
Inner loop: 4

注意,當(dāng)shell執(zhí)行了break命令后掏父,外部循環(huán)就停止了笋轨。

13.7.2 continue 命令
continue命令可以提前中止某次循環(huán)中的命令,但并不會完全終止整個循環(huán)赊淑【粽可以在循環(huán)內(nèi)部設(shè)置shell不執(zhí)行命令的條件。這里有個在for循環(huán)中使用continue命令的簡單例子:

$ cat test21
#!/bin/bash
for (( var1 = 1; var1 < 15; var1++ ))
do
  if [ $var1 -gt 5 ] && [ $var1 -lt 10 ]
  then
    continue
  fi
  echo "Iteration number: $var1"
done
$ ./test21
Iteration number: 1
Iteration number: 2
Iteration number: 3
Iteration number: 4
Iteration number: 5
Iteration number: 10
Iteration number: 11
Iteration number: 12
Iteration number: 13
Iteration number: 14

當(dāng)if-then語句的條件被滿足時(值大于5且小于10)陶缺, shell會執(zhí)行continue命令钾挟,跳過此次循環(huán)中剩余的命令,但整個循環(huán)還會繼續(xù)饱岸。當(dāng)if-then的條件不再被滿足時掺出,一切又回到正軌徽千。
也可以在while和until循環(huán)中使用continue命令,但要特別小心汤锨。記住双抽,當(dāng)shell執(zhí)行continue命令時,它會跳過剩余的命令闲礼。如果你在其中某個條件里對測試條件變量進行增值牍汹,問題就會出現(xiàn):

$ cat badtest3
#!/bin/bash
var1=0
while echo "while iteration: $var1"
  [ $var1 -lt 15 ]
do
  if [ $var1 -gt 5 ] && [ $var1 -lt 10 ]
  then
    continue
  fi
  echo " Inside iteration number: $var1"
  var1=$[ $var1 + 1 ]
done
$ ./badtest3 | more
while iteration: 0
Inside iteration number: 0
while iteration: 1
Inside iteration number: 1
while iteration: 2
Inside iteration number: 2
while iteration: 3
Inside iteration number: 3
while iteration: 4
Inside iteration number: 4
while iteration: 5
Inside iteration number: 5
while iteration: 6
while iteration: 6
while iteration: 6
while iteration: 6
while iteration: 6
while iteration: 6
while iteration: 6
while iteration: 6
while iteration: 6
while iteration: 6
while iteration: 6

你得確保將腳本的輸出重定向到了more命令,這樣才能停止輸出位仁。在if-then的條件成立之前,所有一切看起來都很正常方椎,然后shell執(zhí)行了continue命令聂抢。當(dāng)shell執(zhí)行continue命令時,它跳過了while循環(huán)中余下的命令棠众。不幸的是琳疏,被跳過的部分正是$var1計數(shù)變量增值的地方,而這個變量又被用于while測試命令中闸拿。這意味著這個變量的值不會再變化了空盼,從前面連續(xù)的輸出顯示中你也可以看出來。
和break命令一樣新荤, continue命令也允許通過命令行參數(shù)指定要繼續(xù)執(zhí)行哪一級循環(huán):
continue n
其中n定義了要繼續(xù)的循環(huán)層級揽趾。下面是繼續(xù)外部for循環(huán)的一個例子:

$ cat test22
#!/bin/bash
for (( a = 1; a <= 5; a++ ))
do
  echo "Iteration $a:"
  for (( b = 1; b < 3; b++ ))
  do
    if [ $a -gt 2 ] && [ $a -lt 4 ]#此處用continue命令來停止處理循環(huán)內(nèi)的命令(從這個if到fi),但會繼續(xù)處理外部循環(huán)苛骨。
    then
      continue 2
    fi
    var3=$[ $a * $b ]
    echo "  The result of $a * $b is $var3"
  done
done
$ ./test22
Iteration 1:
  The result of 1 * 1 is 1
  The result of 1 * 2 is 2
Iteration 2:
  The result of 2 * 1 is 2
  The result of 2 * 2 is 4
Iteration 3:
Iteration 4:
  The result of 4 * 1 is 4
  The result of 4 * 2 is 8
Iteration 5:
  The result of 5 * 1 is 5
  The result of 5 * 2 is 10

其中的if-then語句:

if [ $a -gt 2 ] && [ $a -lt 4 ]
then
continue 2
fi

注意:值為3的那次迭代并沒有處理任何內(nèi)部循環(huán)語句篱瞎,因為盡管continue命令停止了處理過程,但外部循環(huán)依然會繼續(xù)痒芝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俐筋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子严衬,更是在濱河造成了極大的恐慌澄者,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件请琳,死亡現(xiàn)場離奇詭異粱挡,居然都是意外死亡,警方通過查閱死者的電腦和手機俄精,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門抱怔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嘀倒,你說我怎么就攤上這事屈留【直” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵灌危,是天一觀的道長康二。 經(jīng)常有香客問我,道長勇蝙,這世上最難降的妖魔是什么沫勿? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮味混,結(jié)果婚禮上产雹,老公的妹妹穿的比我還像新娘。我一直安慰自己翁锡,他們只是感情好蔓挖,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著馆衔,像睡著了一般瘟判。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上角溃,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天拷获,我揣著相機與錄音,去河邊找鬼减细。 笑死匆瓜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的未蝌。 我是一名探鬼主播陕壹,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼树埠!你這毒婦竟也來了糠馆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤怎憋,失蹤者是張志新(化名)和其女友劉穎又碌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绊袋,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡毕匀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了癌别。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皂岔。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖展姐,靈堂內(nèi)的尸體忽然破棺而出躁垛,到底是詐尸還是另有隱情剖毯,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布教馆,位于F島的核電站逊谋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏土铺。R本人自食惡果不足惜胶滋,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悲敷。 院中可真熱鬧究恤,春花似錦、人聲如沸后德。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽探遵。三九已至窟赏,卻和暖如春妓柜,著一層夾襖步出監(jiān)牢的瞬間箱季,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工棍掐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留藏雏,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓作煌,卻偏偏與公主長得像掘殴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子粟誓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容