上篇我們學習了shell中條件選擇語句的用法。接下來本篇就來學習迴圈語句。在shell中,迴圈是通過for, while, until命令來實現的。下麵就分別來看看吧。 for for迴圈有兩種形式: for in語句 基本格式如下: for var in list do commands done ...
上篇我們學習了shell中條件選擇語句的用法。接下來本篇就來學習迴圈語句。在shell中,迴圈是通過for, while, until命令來實現的。下麵就分別來看看吧。
for
for迴圈有兩種形式:
for-in語句
基本格式如下:
for var in list
do
commands
done
list代表要迴圈的值,在每次迴圈的時候,會把當前的值賦值給var(變數名而已,隨意定), 這樣在迴圈體中就可以直接通過$var獲取當前值了。
先來一個例子吧:
#!/bin/bash
for str in a b c d e
do
echo $str
done
以上會根據空格將abcde分割,然後依次輸出出來。
如果以上例子不是以空格分割,而是以逗號(,)分割呢?
#!/bin/bash
list="a,b,c,d,e"
for str in $list
do
echo $str
done
結果輸出a,b,c,d,e
造成這個結果的原因是:for...in迴圈預設是迴圈一組通過空格或製表符(tab鍵)或換行符(Enter鍵)分割的值。這個其實是由內部欄位分隔符配置的,它是由系統環境變數IFS定義的。當然,既然是由環境變數定義的,那當然也就能修改啊。
修改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的值設置為逗號了, 當然,不一定要是逗號,想設置什麼,你說了算!
C語言風格的for迴圈
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迴圈有點變態了。與其它編程語言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語句基本格式如下:
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命令來控制迴圈的。下麵就分別來看看二者的基本用法:
break
- break用於跳出當前迴圈。
示例一:
#!/bin/bash
for (( flag=0; flag <= 10; flag++ ))
do
if (( $flag == 5 ))
then
break
fi
echo $flag
done
以上當flag的值為5的時候,退出迴圈。輸出結果為0-4的值。
- break用於跳出內層迴圈。
示例二:
#!/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用於跳出外層迴圈
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後面的語句不會執行。
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