shell中的循環結構

2021-06-09

關鍵字:


 

1、for循環

 

shell中的for循環有三種類型:

1、帶列表的;

2、不帶列表的;

3、C語言風格的;

 

不管哪種類型的for循環,其功能都是根據循環條件重複執行循環體中的語句。

 

帶列表的for循環

列表是指一個已知的有限數量的整數或字符串型數組。

 

此循環的語法如下所示:

for var in {list}
do
    statement1
    statement2
    statementn
done

循環開始後,list列表中的數據會按從左至右的順序依次賦給 var 變量,直至所有元素走完則循環停止。

 

如果列表內容是整數,則必須在數組兩側加上大括號。而如果列表內容爲字符串,則可以省略兩側的大括號。

 

列表字段除了明確指定內容外還可以使用“通配符”表示。通配符爲一個星號 '*' ,其表示當前目錄下的所有文件名稱,與命令 'ls *' 等價。

 

幾種常見的帶列表的for循環寫法如下所示:

for var in  1 2 3 4 5
do

done

#現場創造一個 1 ~ 8 的連續整數數組出來。
for var in {1...8}
do

done

#創建一個1~10的整數數組,但是前進步長爲3。
#實際上只有1 4 7 10會被賦給var變量
for var in {1..10..3}
do

done

#與第一個例子等效
for var in a b c d e
do

done

#與上一個例子等效
for var in $(ls)
do

done

 

 

不帶列表的for循環

事實上,不存在可以不帶列表數據的for循環,這裏所說的不帶列表其實只是隱藏了列表而已。

 

若在編寫for循環時不明確指明列表數據,則shell默認會使用參數列表作爲數據列表源。

#!/bin/bash

for var
do
    echo "var:$var"
done

將此源碼儲存爲sh文件,並以以下命令運行:

./loop_test.sh p1 p2 p3

則可以看到如下結果:

var:p1
var:p2
var:p3

 

 

C語言風格的for循環 

 這個純粹是爲了照顧C/C++程序員而設計的寫法。其語法格式如下:

for (( 表達式1; 表達式2; 表達式3 ))
do
    語句1
    語句n
done

括號內的三個表達式與C語言中的一致,就不再贅述了。具體的實例如下:

#!/bin/bash

for (( i=1; i<5; i++ ))
do
    echo "i=$i"
done

運行結果如下:

i=1
i=2
i=3
i=4

 

 

使用for循環處理數組的示例代碼如下所示:

#!/bin/bash

array=(mon tue wed thu fri sat sun)

for var in ${array[*]}
do
 echo $day
done

 

 

2、while循環

 

while循環的語法結構如下所示:

#!/bin/bash

while 表達式
do
    語句1
    語句2
    語句n
done

當表達式的值爲真(即返回值爲0時)時執行循環體中的代碼。

 

以下爲一個示例程序:

#!/bin/bash

i=1
while test $i -lt 10
do
    echo "i=$i"
    let i++
done

echo
echo

j=9
while [ $j -gt 4 ]
do
    echo "j=$j"
    let j--
done

執行結果如下所示:

i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9


j=9
j=8
j=7
j=6
j=5

 

 

3、until循環

 

until循環可以簡單理解成就是 while 循環的“非”態。其語法格式如下所示:

#!/bin/bash

until 表達式
do
    語句1
    語句2
    語句n
done

當表達式的值爲假(即返回值爲非0時)時執行循環體中的語句。

 

因其與while是“相對”的關係,因此就不再舉例了。

 

 

4、循環跳出語句

 

與傳統編程語言類似,shell也提供了 break 和 continue 兩個語句用於強行從循環中跳出。

 

這兩個語句的基本用法與含義與其它編程語言一致,就不再解釋及舉例了。

 

但是shell中的break和continue又有一點與其它語言不同:它們都允許在語句後加一個數字以表示需要跳出多少層循環(主要用於有循環嵌套的場景)。

 

當 break 語句後加一個數字時,表示直接跳出指定數字層數的循環,若數字值大於實際嵌套層數,則跳到最外層即停止。

 

當 continue 語句後加一個數字時,表示直接跳出指定數字層數的循環去執行下一週期的循環體代碼。若數字值大於實際嵌套層數,則跳到最外層即停止。

 

以下給出示例代碼:

#!/bin/bash

for (( i=1; i<4; i++ ))
do
    for (( j=9; j>6; j-- ))
    do
        echo "i*j=$((i*j))"
        if [ $j -lt 9 ]
        then
            continue 20
        fi
    done
    echo
    if test $i -gt 2
    then
        break
    fi
done

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章