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