與其他程式設計語言一樣,bash shell指令碼也支援for
迴圈以執行重複性任務。它有助於在字串中的一系列單詞或陣列中的元素上疊代一組特定的語句。例如,可以多次執行UNIX命令(或任務),也可以僅使用for
迴圈讀取和處理命令列表。
可以通過兩種方式在bash指令碼上應用for
迴圈。一種方法是for-in
,另一種方法是C語言語法。以下是bash shell指令碼中for
迴圈的語法:
for variable in list
do
commands
done
或者 -
for (( expression1; expression2; expression3 ))
do
commands
done
for
迴圈語句有一些關鍵點需要記住:
for
迴圈的每個塊均以do
關鍵字開頭,後跟該塊中的命令。for
迴圈語句由done
關鍵字關閉。for
迴圈的疊代時間取決於宣告的列表變數。do
和done
之間執行命令後,迴圈返回頂部,並從列表中選擇下一項,然後重複整個過程。下面提供了一些for
迴圈範例,以說明它們如何工作:
範例1 - for迴圈基礎
Bash指令碼:for-basic.sh
#!/bin/bash
#This is the basic example of 'for loop'.
learn="Start learning from tw511.com"
for learn in $learn
do
echo $learn
done
echo "Thank You."
執行上面範例程式碼,得到以下結果:
範例2 - for迴圈範圍
for
迴圈讀取範圍,Bash指令碼:for-range.sh
#!/bin/bash
#This is the basic example to print a series of numbers from 1 to 10.
for num in {1..10}
do
echo $num
done
echo "Series of numbers from 1 to 10."
執行上面範例程式碼,得到以下結果:
範例3 - for迴圈增/減的範圍
For迴圈讀取帶增/減的範圍,可以通過新增兩個點(..
)並將值相加來增加或減少指定的值,例如{START..END..INCREMENT}
。檢視以下範例:
遞增範例,指令碼:for-increment.sh
#!/bin/bash
#For Loop to Read a Range with Increment
for num in {1..10..1}
do
echo $num
done
執行上面範例程式碼,得到以下結果:
遞減範例,指令碼:for-decrement.sh
#!/bin/bash
#For Loop to Read a Range with Decrement
for num in {10..0..1}
do
echo $num
done
執行上面範例程式碼,得到以下結果:
範例4 - for迴圈讀取陣列變數
可以使用for
迴圈來迭代陣列的值。
語法可以定義為:
array=( "element1" "element 2" . . "elementN" )
for i in "${arr[@]}"
do
echo $i
done
對於array
中的每個元素,將執行從「do」到「done」的語句或命令集。對於各個疊代,可以在迴圈內將每個元素作為i
進行存取。請檢視下面的範例,演示如何使用for
迴圈遍歷陣列中的元素。
指令碼檔案:for-array.sh
#!/bin/bash
#Array Declaration
arr=( "Welcome","to","tw511.com" )
for i in "${arr[@]}"
do
echo $i
done
執行上面範例程式碼,得到以下結果:
maxsu@yiibai:~/bashcode$ vi for-array.sh
maxsu@yiibai:~/bashcode$ chmod u+x for-array.sh
maxsu@yiibai:~/bashcode$ ./for-array.sh
Welcome,
to,
tw511.com
範例5 - for迴圈讀取字串中的空白作為單詞分隔符
語法可以定義如下:
#!/bin/bash
for word in $str;
do
<Statements>
done
在這裡,str
是指字串。
對字串的每個「單詞」執行從do
到done
中的語句。檢視以下範例:
指令碼檔案:for-string.sh
#!/bin/bash
#For Loop to Read white spaces in String as word separators
str="Let's start
learning from tw511.com."
for i in $str;
do
echo "$i"
done
執行上面範例程式碼,得到以下結果:
範例6 - for迴圈以單詞形式讀取字串中的每一行
語法定義如下:
#!/bin/bash
for word in "$str";
do
<Statements>
done
在這裡,對字串的「每行」執行從do
到done
的語句。參考以下範例:
Bash指令碼檔案:for-string2.sh
#!/bin/bash
#For Loop to Read each line in String as a word
str="Let's start
learning from
tw511.com."
for i in "$str";
do
echo "$i"
done
執行上面範例程式碼,得到以下結果:
注意:「
for
迴圈將字串中的空白作為單詞分隔符讀取」與「For
迴圈將字串中的每一行作為單詞讀取」的唯一區別是字串變數周圍的雙引號。
範例7 - for迴圈讀取三表示式
三表示式語法是for
迴圈的最常見語法。第一個表示式指的是初始化過程,第二個表示式指的是終止,第三個表示式指的是增量或減量。
檢視以下範例,使用帶for
迴圈的三表示式列印1
至10
之間的數位:
Bash指令碼檔案:three-expression.sh
#!/bin/bash
#For Loop to Read Three-expression
for ((i=1; i<=10; i++))
do
echo "$i"
done
執行上面範例程式碼,得到以下結果:
範例8 - for迴圈與break語句
可以在for
迴圈中使用break
語句來終止迴圈。
Bash指令碼檔案:for-break.sh
#!/bin/bash
#Table of 2
for table in {2..100..2}
do
echo $table
if [ $table == 20 ]; then
break
fi
done
執行上面範例程式碼,得到以下結果:
範例9 - for迴圈與continue語句
可以在for
迴圈中使用continue
語句來跳過特定條件下的特定語句。它告訴Bash停止執行迴圈的特定迭代並處理下一個疊代。
Bash指令碼檔案:for-continue.sh
#!/bin/bash
#Numbers from 1 to 20, ignoring from 6 to 15 using continue statement"
for ((i=1; i<=20; i++));
do
if [[ $i -gt 5 && $i -lt 16 ]];
then
continue
fi
echo $i
done
執行上面範例程式碼,得到以下結果:
範例10 - for無限迴圈
當bash的三個表示式中沒有「開始,條件和增量」迴圈時,它將變為無限迴圈。要終止Bash中的無限迴圈,可以按Ctrl + C。
Bash指令碼檔案:for-infinite.sh
#!/bin/bash
i=1;
for (( ; ; ))
do
sleep 1s
echo "Current Number: $((i++))"
done
執行上面範例程式碼,得到以下結果: