
循環是編程語言的基本概念之一。當你想要一遍又一遍地運行一系列命令直到達到某個條件后終止退出時,循環很方便。
在諸如 Bash 之類的腳本語言中,循環對于自動執行重復性任務非常有用。
在 Bash 腳本中有3個基本的循環結構,for 循環, while 循環,until 循環。
在本教程中,我們將介紹 Bash 中 for 循環的基礎知識以及用于改變循環流的 break 和 continue 語句。
標準 Bash for 循環
for 循環遍歷項列表并執行給定的命令集。
Bash for 循環采用以下形式:
for item in [LIST]do [COMMANDS]done
列表可以是由空格分隔的一系列字符串,一系列數字,命令輸出,數組等。
循環遍歷字符串
在下面的示例中,循環將遍歷字符串列表中的每個項目,使用變量 element 代表當前項目。
for element in Hydrogen Helium Lithium Berylliumdo echo "Element: $element"done
循環將產生以下輸出:
Element: HydrogenElement: HeliumElement: LithiumElement: Beryllium
循環遍歷數字范圍
您可以使用序列表達式通過定義范圍的起點和終點來指定數字或字符的范圍。序列表達式采用以下形式:
{START..END}
在下面的示例中,循環將遍歷從 0 到 3 的所有數字。
for i in {0..3}do echo "Number: $i"doneNumber: 0Number: 1Number: 2Number: 3
從 Bash 4 開始,還可以在使用范圍時指定增量。表達式采用以下形式:
{START..END..INCREMENT}for i in {0..20..5}do echo "Number: $i"doneNumber: 0Number: 5Number: 10Number: 15Number: 20
循環數組元素
您還可以使用 for 循環迭代元素數組:
在下面的示例中,我們定義一個數組 BOOKS 并迭代數組的每個元素。
BOOKS=('In Search of Lost Time' 'Don Quixote' 'Ulysses' 'The Great Gatsby')for book in "${BOOKS[@]}"; do echo "Book: $book"doneBook: In Search of Lost TimeBook: Don QuixoteBook: UlyssesBook: The Great Gatsby
C 風格的 Bash for 循環
C-style for 循環的語法采用以下形式:
for ((INITIALIZATION; TEST; STEP))do [COMMANDS]done
INITIALIZATION 部分僅在循環開始時執行一次。然后,評估 TEST 部分。如果為假,則 for 循環終止。如果 TEST 為真,則執行 for 循環體內的命令并更新 STEP 部分。
在下面的代碼中,循環通過初始化星型 i = 0 ,然后在每次迭代之前檢查是否 i ≤ 10 。如果為 true ,則打印當前值 i 并將變量遞增 i 1 (i++) ,否則循環終止。
for ((i = 0 ; i <= 1000 ; i++)); do echo "Counter: $i"done
循環迭代 1001 次并將產生以下輸出:
Counter: 0Counter: 1Counter: 2...Counter: 998Counter: 999Counter: 1000
break 和 continue
break 和 continue 語句可用于控制 for 循環執行。
break 語句
break 語句終止當前循環并將程序控制傳遞給終止語句后面的語句。它通常用于在滿足某個條件時終止循環。
在下面的示例中,一旦當前迭代項等于 ‘Lithium’ ,循環的執行將終止。
for element in Hydrogen Helium Lithium Beryllium; do if [[ "$element" == 'Lithium' ]]; then break fi echo "Element: $element"doneecho 'All Done!'Element: HydrogenElement: HeliumAll Done!
continue 語句
continue 語句退出循環的當前迭代,并將程序控制傳遞給循環的下一次迭代。
在下面的示例中,我們迭代一系列數字,當當前迭代項等于 ‘2’ 時, continue 語句將導致執行返回到循環的開頭并繼續下一次迭代。
for i in {1..5}; do if [[ "$i" == '2' ]]; then continue fi echo "Number: $i"doneNumber: 1Number: 3Number: 4Number: 5
For 循環示例
重命名文件名中包含空格的文件
下面的示例演示如何使用 Bash for 循環通過將空格替換為下劃線來重命名當前目錄中的所有文件,并在其名稱中包含空格。
for file in * *; do mv "$file" "${file// /_}"done
讓我們逐行分解代碼:
- 第一行創建一個 for 循環,并遍歷其名稱中帶有空格的所有文件的列表。表達式 * * 創建列表。
- 第二行適用于列表中的每個項目,并將文件移動到新的文件,用下劃線 (_) 替換空格。該部分 ${file// /_ } 使用 shell 參數擴展來用字符串替換參數中的模式。
- done 表示循環段的結束。
更改文件擴展名
以下示例顯示如何使用 Bash for 循環通過將文件擴展名從 .jpeg 替換為 .jpg 來重命名當前目錄中以 .jpeg 結尾的所有文件。
for file in *.jpeg; do mv -- "$file" "${file%.jpeg}.jpg"done
讓我們逐行分析代碼:
- 第一行創建一個 for 循環,并遍歷一個包含 .jpeg 結尾的所有文件的列表。
- 第二行適用于列表中的每個項目,并將文件移動到一個用 .jpg 替換 .jpeg 的新文件。該部分 ${file%.jpeg }使用 shell 參數擴展從文件名中刪除 .jpeg 部分。
- done 表示循環段的結束。
結論
到目前為止,您應該很好地理解如何使用 bash for 循環遍歷列表。