Shell下的迴圈結構是類C的,同樣也有for迴圈、while迴圈,此外,Shell也有until迴圈。 for迴圈 for迴圈的基本文法
for variable in {list}do statement1 statement2 ...done
for迴圈的文法意思與C語言一樣,即執行迴圈體的次數由list決定。list在這裡是一個列表,可以是一系列的數字或字串,元素之間用空格隔開
舉例:依次列印出1~10。
1、列出list列表:
#! /bin/bash for i in 1 2 3 4 5 6 7 8 9 10 do echo "number is $i" done~
2、list列表可以表示為:{1..8}
#! /bin/bash for i in {1..8} do echo "number is $i" done
運行結果:
改變for迴圈增長步長
上述方式的for迴圈中,變數每次只能增長1,Shell允許使用者自訂增長步長。
基本文法為:
for variable in {start..end..step}do statement1 statement2 ...done
start表示起始值,end表示終止值,step表示增長值。
舉例:通過for迴圈輸出100以內奇數的和:
#! /bin/bashsum=0for i in {1..100..2}do let "sum+=i";doneecho "result is : $sum"
不帶列表的for迴圈
我們先來瞭解幾個Shell中的位置參數:
$0:相當於main函數參數的argv[0]$1、$2...:稱為位置參數,相當於main函數參數的argv[1],argv[2]....$#:相當於main函數的argc-1,這裡的#不表示注釋$@:表示參數列表"$1","$2",可以用在for迴圈in的後邊$?:上一條命令的退出碼$$:當前shell的進程號
舉例:輸出每命令列的每個參數
for val in $@do echo "$val"done
不帶列表的迴圈實現為:
for valdo echo "$val"done
以上兩種實現方式是等效的。 類C風格的for迴圈
for ((expression1;expression2;expression3))do statement1; statement2; ...done
舉例:用該中方式列印1~10
for (( i=1;i<10;i++ ))do echo "number is $i"done
for迴圈處理數組
基本文法:
for variable in ${array[*]}do statement1; statement2; ...done
舉例:列印數組內容
array=(1 2 3 4 5 6 7 8) #這句表示定義一個數組for i in ${array[*]}do echo $idone
while迴圈
while迴圈基本用法
基本文法:
while expressiondo statement1 statement2 ...done
while迴圈的文法與C語言的while迴圈仍是一樣,只要條件滿足就執行。
舉例:使用while迴圈輸出1~9的平方
i=1while [ "$i" -lt 10 ]do let "square=i*i" echo "$i*$i=$square" let "i+=1"done
輸出結果:
until迴圈 until迴圈的基本用法
基本文法:
until expressiondo statement1 statement2 ...done
until迴圈與C語言中的do…while迴圈類似,即反覆執行迴圈體,直到某一條件成立則退出迴圈體。
舉例:使用until迴圈執行上述while迴圈的例子,即列印1~9的平方。
i=1until [ "$i" -gt 10 ] #這就需要判斷i大於10時退出迴圈do let "square=i*i" echo "$i*$i=$square" let "i+=1"done
使用break和continue控制迴圈
利用break控制迴圈
break的作用是立即跳出某個迴圈。
舉例:輸出5以內的乘法表
#! /bin/bashfor ((i=1;i<9;i++))do for ((j=1;j<=i;j++)) do let "result=$i*$j" printf "$i * $j = $result " done printf "\n"#當i變數的值為5時退出迴圈 if [ $i -eq 5 ] then break fidone
輸出結果為:
利用continue控制迴圈
continue的作用是跳過當前迴圈體中該句後邊的語句,重新從迴圈體開始執行。
舉例:輸出10以內的偶數
#列印10以內的偶數for val in {1..10}do if [[ "$val2" -eq 1 ]] then continue fi printf "$val "doneprintf "\n"
運行結果為: