shell編程其實真的很簡單(四)


上篇我們學習了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

  1. break用於跳出當前循環

示例一:

#!/bin/bash
for (( flag=0; flag <= 10; flag++ ))
do
    if (( $flag == 5 ))
    then
        break
    fi
    echo $flag
done

以上當flag的值為5的時候,退出循環。輸出結果為0-4的值。

  1. 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

...

  1. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM