首頁 > 軟體

Bash 中的 For 迴圈詳解

2020-06-16 16:34:18

迴圈是程式語言的基本概念之一。當你想要一遍又一遍地執行一系列命令直到達到某個條件後終止退出時,迴圈很方便。

在諸如 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 Beryllium
do
  echo "Element: $element"
done

迴圈將產生以下輸出:

Element: Hydrogen
Element: Helium
Element: Lithium
Element: Beryllium

迴圈遍歷數位範圍

您可以使用序列表示式通過定義範圍的起點和終點來指定數位或字元的範圍。序列表示式採用以下形式:

{START..END}

在下面的範例中,迴圈將遍歷從 0 到 3 的所有數位。

for i in {0..3}
do
  echo "Number: $i"
done
Number: 0
Number: 1
Number: 2
Number: 3

從 Bash 4 開始,還可以在使用範圍時指定增量。表示式採用以下形式:

{START..END..INCREMENT}
for i in {0..20..5}
do
  echo "Number: $i"
done
Number: 0
Number: 5
Number: 10
Number: 15
Number: 20

迴圈陣列元素

您還可以使用 for 迴圈疊代元素陣列:

在下面的範例中,我們定義一個陣列 BOOKS 並迭代陣列的每個元素。

BOOKS=('In Search of Lost Time' 'Don Quixote' 'Ulysses' 'The Great Gatsby')

for book in "${BOOKS[@]}"; do
  echo "Book: $book"
done
Book: In Search of Lost Time
Book: Don Quixote
Book: Ulysses
Book: 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: 0
Counter: 1
Counter: 2
...
Counter: 998
Counter: 999
Counter: 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"
done

echo 'All Done!'
Element: Hydrogen
Element: Helium
All Done!

continue 語句

continue 語句退出迴圈的當前疊代,並將程式控制傳遞給迴圈的下一次疊代。

在下面的範例中,我們疊代一系列數位,當當前疊代項等於 ‘2’ 時, continue 語句將導致執行返回到回圈的開頭並繼續下一次疊代。

for i in {1..5}; do
  if [[ "$i" == '2' ]]; then
    continue
  fi
  echo "Number: $i"
done
Number: 1
Number: 3
Number: 4
Number: 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 迴圈遍歷列表。

如果您有任何問題,請隨時發表評論。


IT145.com E-mail:sddin#qq.com