上篇咱們學習了shell中條件選擇語句的用法。接下來本篇就來學習循環語句。在shell中,循環是經過for, while, until命令來實現的。下面就分別來看看吧。java
for循環有兩種形式:shell
基本格式以下:編程
for var in list do commands done
list表明要循環的值,在每次循環的時候,會把當前的值賦值給var(變量名而已,隨意定), 這樣在循環體中就能夠直接經過$var獲取當前值了。bash
先來一個例子吧:編程語言
#!/bin/bash for str in a b c d e do echo $str done
以上會根據空格將abcde分割,而後依次輸出出來。學習
若是以上例子不是以空格分割,而是以逗號(,)分割呢?code
#!/bin/bash list="a,b,c,d,e" for str in $list do echo $str done
結果輸出a,b,c,d,eget
形成這個結果的緣由是:for...in循環默認是循環一組經過空格或製表符(tab鍵)或換行符(Enter鍵)分割的值。這個實際上是由內部字段分隔符配置的,它是由系統環境變量IFS定義的。固然,既然是由環境變量定義的,那固然也就能修改啊。博客
#!/bin/bash #定義一個變量oldIFS保存未修改前的IFS的值 oldIFS=$IFS #修改IFS值,以逗號爲分隔符 IFS=$',' list=a,b,c,d,e list2="a b c d e" for var in $list do echo $var done for var2 in $list2 do echo $var2 done #還原IFS的值 IFS=$oldIFS
以上第一個循環會分別輸出abcde幾個值。而第二個循環會輸出a b c d e(即未處理)。由於咱們把IFS的值設置爲逗號了, 固然,不必定要是逗號,想設置什麼,你說了算!it
bash中c語言風格的for循環遵循以下格式:
for (( variable assignment ; condition ; iteration process ))
一個例子足以說明:
#!/bin/bash for (( i = 0; i <= 10; i++ )) do echo $i done
上面例子循環11次,從0到10依次輸出。稍微有過編程基礎的都對此應該很熟悉。就不作詳細闡述了。
若是你習慣了其它語言的while循環,那麼到這兒你又會發現這個while循環有點變態了。與其它編程語言while的不一樣在於:在bash中的while語句,看起來彷佛是結合了if-then語句(參考上一篇)和for循環語句。其基本格式以下:
while test command do other commands done
與if-then語句同樣,後面接test命令,若是test後面的命令的退出狀態碼爲0. 那麼就進入循環,執行do後面的邏輯。要注意在do後面的邏輯中寫條件,避免死循環。
既然是接test命令,那麼一切均可以參考if-then的test
示例一:
#!/bin/bash flag=0 while test $flag -le 10 do echo $flag # 若是沒有這句,那麼flag的值一直爲0,就會無限循環執行 flag=$[$flag + 1] done
以上判斷flag是否大於或者等於10, 若是知足條件,那麼輸出當前flag的值,而後再將flag的值加1。最終輸出的結果爲0到10的結果。
結合上一篇文章test的寫法,咱們還能夠將以上示例變形爲以下:
示例二:
#!/bin/bash flag=0 while [ $flag -le 10 ] do echo $flag flag=$[$flag + 1] done
示例三:
flag=0 while (( $flag <= 10 )) do echo $flag flag=$[$flag + 1] done
until語句基本格式以下:
until test commands do other commands done
在掌握while循環語句以後, until語句就很簡單了。until語句就是與while語句剛好相反, while語句是在test命令退出狀態碼爲0的時候執行循環, 而until語句是在test命令退出狀態碼不爲0的時候執行。
示例:
#!/bin/bash flag=0 until (( $flag > 10 )) do echo $flag flag=$[ $flag + 1 ] done
以上輸出0到10的值。until後面的條件與上面while例子徹底相反。
好啦,到此,咱們學完了shell的循環語句啦。不過上面咱們寫的循環語句都是根據條件執行完畢,若是咱們在執行的過程當中想退出,該怎麼辦?接下來就繼續看看怎麼控制循環語句。
與其它編程語言同樣,shell是經過break和continue命令來控制循環的。下面就分別來看看兩者的基本用法:
示例一:
#!/bin/bash for (( flag=0; flag <= 10; flag++ )) do if (( $flag == 5 )) then break fi echo $flag done
以上當flag的值爲5的時候,退出循環。輸出結果爲0-4的值。
示例二:
#!/bin/bash flag=0 while (( $flag < 10 )) do for (( innerFlag=0; innerFlag < 5; innerFlag++ )) do if (( $innerFlag == 2 )) then break fi echo "innerFlag=$innerFlag" done echo "outerFlag=$flag" done
以上代碼在執行內部循環for的時候,當innerFlag值爲2的時候就會跳出到外層的while循環, 因爲外層循環一直flag都爲0, 因此while會成爲一個死循環,不停的輸出:
...
innerFlag=0
innerFlag=1
outerFlag=0
...
break 可後接數字,用於表示退出當前循環的外層的第幾層循環。
示例三:
#!/bin/bash flag=0 while (( $flag < 10 )) do for (( innerFlag=0; innerFlag < 5; innerFlag++ )) do if (( $innerFlag == 2 )) then # 2表示外面一層循環 break 2 fi echo "innerFlag=$innerFlag" done echo "outerFlag=$flag" done
與上面例子相比,本例就只是在break後面跟了個數字2,表示退出外面的第一層循環。最終輸出:
innerFlag=0
innerFlag=1
continue表示終止當前的一次循環,進入下一次循環,注意,continue後面的語句不會執行。
continue的語法與break同樣,所以,就只作一個示例演示啦。
示例:
flag=0 while (( $flag <= 10 )) do if (( $flag == 5 )) then flag=$[$flag+1] continue fi echo "outerFlag=$flag" for (( innerFlag=11; innerFlag < 20; innerFlag++ )) do if (( $innerFlag == 16 )) then flag=$[$flag+1] continue 2 fi echo "innerFlag=$innerFlag" done done
以上例子: 當for循環中innerFlag的值爲16的時候會跳到外層while循環,當外層循環的flag的值爲5的時候,會直接跳過本次循環,而後進入下一次循環,所以在輸出的結果中,不會出現outerFlag=5的狀況。
個人博客www.javafan.cn