Bash for迴圈


與其他程式設計語言一樣,bash shell指令碼也支援for迴圈以執行重複性任務。它有助於在字串中的一系列單詞或陣列中的元素上疊代一組特定的語句。例如,可以多次執行UNIX命令(或任務),也可以僅使用for迴圈讀取和處理命令列表。

for迴圈的語法

可以通過兩種方式在bash指令碼上應用for迴圈。一種方法是for-in,另一種方法是C語言語法。以下是bash shell指令碼中for迴圈的語法:

for variable in list  
do  
commands  
done

或者 -

for (( expression1; expression2; expression3 ))  
do  
commands  
done

for迴圈語句有一些關鍵點需要記住:

  • bash中for迴圈的每個塊均以do關鍵字開頭,後跟該塊中的命令。for迴圈語句由done關鍵字關閉。
  • for迴圈的疊代時間取決於宣告的列表變數。
  • 迴圈將從列表中選擇一項,在迴圈中使用的變數上分配值。
  • dodone之間執行命令後,迴圈返回頂部,並從列表中選擇下一項,然後重複整個過程。
  • 列表可以包含數位或字串等,以空格分隔。

for迴圈範例

下面提供了一些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."

執行上面範例程式碼,得到以下結果:
for循環基礎

範例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."

執行上面範例程式碼,得到以下結果:
for循環範圍

範例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循環增範圍

遞減範例,指令碼:for-decrement.sh

#!/bin/bash  

#For Loop to Read a Range with Decrement  

for num in {10..0..1}  
do  
echo $num  
done

執行上面範例程式碼,得到以下結果:
for循環遞減示例

範例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是指字串。

對字串的每個「單詞」執行從dodone中的語句。檢視以下範例:

指令碼檔案: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

在這裡,對字串的「每行」執行從dodone的語句。參考以下範例:

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迴圈的三表示式列印110之間的數位:

Bash指令碼檔案:three-expression.sh

#!/bin/bash  
#For Loop to Read Three-expression  

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

執行上面範例程式碼,得到以下結果:
for循環讀取三表達式

範例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

執行上面範例程式碼,得到以下結果:
for循環與break語句

範例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

執行上面範例程式碼,得到以下結果:
for循環與continue語句

範例10 - for無限迴圈

當bash的三個表示式中沒有「開始,條件和增量」迴圈時,它將變為無限迴圈。要終止Bash中的無限迴圈,可以按Ctrl + C

Bash指令碼檔案:for-infinite.sh

#!/bin/bash  

i=1;  
for (( ; ; ))  
do  
sleep 1s  
echo "Current Number: $((i++))"  
done

執行上面範例程式碼,得到以下結果:

for無限循環