Bash 指令碼迴圈詳解及示例


如果您是 Linux 或 Unix 使用者,則很可能至少使用過一兩次 Bash。Bash 是一種命令列 shell,它允許您以比使用圖形使用者介面更直接和更強大的方式與作業系統進行互動。Bash 最強大的功能之一是 for 迴圈,它允許您透過迭代值列表來自動執行重複性任務。在本文中,我們將探討 Bash for 迴圈的工作原理,並提供一些如何在自己的指令碼中使用它的示例。

什麼是 For 迴圈?

for 迴圈是一種控制結構,它允許您重複執行一段程式碼固定次數,或遍歷一個值列表。for 迴圈的基本語法如下所示:

for variable in list
do
   commands
done

這裡,變數是一個佔位符,依次獲取列表中每個專案的 value,commands 是一段在每次迴圈執行時執行的 Bash 命令塊。迴圈將繼續,直到列表中的每個專案都已處理完畢。

遍歷值列表

for 迴圈最簡單的用例是遍歷值列表。假設您在目錄中有一系列檔名,並且您希望在單獨的行上列印每個檔名。以下是如何執行此操作:

for file in /path/to/directory/*
do
   echo $file
done

在此示例中,我們使用萬用字元 * 來指定我們希望遍歷目錄中的所有檔案。echo 命令用於在單獨的行上列印每個檔名。請注意,我們在呼叫 echo 時使用 $ 符號來引用 file 變數。

遍歷數字範圍

for 迴圈的另一個常見用例是遍歷數字範圍。假設您希望在單獨的行上列印數字 1 到 10。以下是如何執行此操作:

示例

for i in {1..10}
do
   echo $i
done

在此示例中,我們使用花括號 {} 來指定我們希望遍歷的數字範圍。echo 命令用於在單獨的行上列印每個數字。

輸出

1
2
3
4
5
6
7
8
9
10

遍歷陣列

在 Bash 中,您還可以建立陣列以在一個變數中儲存多個 value。以下是如何使用 for 迴圈遍歷姓名陣列的示例:

示例

names=("Alice" "Bob" "Charlie" "Dave")

for name in "${names[@]}"
do
   echo "Hello, $name!"
done

輸出

Hello, Alice!
Hello, Bob!
Hello, Charlie!
Hello, Dave!

在此示例中,我們定義了一個名為 names 的陣列,其中包含四個 value。"${names[@]}" 語法用於將陣列擴充套件為 for 迴圈可以遍歷的值列表。echo 命令用於為每個姓名列印問候語。

巢狀 For 迴圈

有時您可能需要在一個 for 迴圈內使用另一個 for 迴圈。這稱為巢狀 for 迴圈。假設您有一系列副檔名和一系列目錄,並且您希望遍歷每個副檔名和目錄的組合。以下是如何執行此操作:

示例

extensions=("txt" "pdf" "docx")
directories=("/path/to/dir1" "/path/to/dir2" "/path/to/dir3")

for ext in "${extensions[@]}"
do
   for dir in "${directories[@]}"
   do
      echo "Files with extension .$ext in $dir:"
         ls "$dir"/*.$
      .$ext
   done
done

在此示例中,我們定義了兩個名為 extensions 和 directories 的陣列。我們使用巢狀 for 迴圈來遍歷每個副檔名和目錄的組合。echo 命令用於列印一條訊息,指示正在處理的副檔名和目錄,並且 ls 命令用於列出具有當前副檔名的目錄中的所有檔案。

使用 Continue 跳過迭代

有時您可能希望根據某個條件跳過 for 迴圈的迭代。這可以使用 continue 關鍵字來完成。假設您有一系列檔名,並且您希望打印出所有名稱,除了以字母“a”開頭的檔案。以下是如何執行此操作:

for file in /path/to/directory/*
do
if [[ "$file" == /path/to/directory/a* ]]; then
   continue
fi
   echo $file
done

在此示例中,我們使用 if 語句來檢查檔名是否以字母“a”開頭。如果是,我們使用 continue 關鍵字跳過迴圈中其餘的程式碼並轉到下一次迭代。如果檔名不以“a”開頭,我們使用 echo 命令列印檔名。

高階 For 迴圈技巧

除了 for 迴圈的基本語法之外,Bash 還提供了一些高階技巧,您可以使用這些技巧使您的 for 迴圈更強大和靈活。以下是一些示例:

使用命令的輸出作為列表

您可以使用命令的輸出作為列表,在 for 迴圈中進行迭代。假設您希望打印出主目錄中所有包含 10 個以上檔案的目錄。以下是如何執行此操作:

for dir in $(find ~/ -type d -exec sh -c 'ls -1 "{}" | wc -l' \; -print | awk -F: '$1>=10 {print $2}')
do
   echo $dir
done

在此示例中,我們使用 find 命令查詢主目錄中的所有目錄。然後,我們結合使用 sh、ls、wc 和 awk 命令來計算每個目錄中的檔案數量並過濾掉檔案數量少於 10 個的目錄。生成的目錄列表隨後用作 for 迴圈的輸入。

使用 C 風格的 For 迴圈

Bash 還提供了一種使用 C 風格的 for 迴圈語法的方法,這對於更復雜的迴圈場景非常有用。以下是一個示例:

示例

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

輸出

0
1
2
3
4
5
6
7
8
9

在此示例中,我們使用 ((...)) 語法來定義一個 C 風格的 for 迴圈,該迴圈從 0 計數到 9。i++ 表示式用於在每次迴圈執行時將 i 的 value 增加 1。

使用 While 迴圈和 Read 命令

最後,您可以使用 while 迴圈和 read 命令來迭代使用者輸入的值列表。以下是一個示例:

while read line
do
   echo "You entered: $line"
done

在此示例中,我們使用 read 命令讀取使用者輸入的行文字。然後,while 迴圈將繼續執行,直到使用者輸入檔案結束字元(通常為 Ctrl+D)。echo 命令用於列印使用者輸入的每一行文字。

有效使用 Bash For 迴圈的技巧

雖然 Bash for 迴圈是一個強大的工具,但有一些技巧和竅門可以使您的迴圈更加有效。以下是在使用 Bash for 迴圈時需要記住的一些事項:

使用描述性變數名稱

在定義儲存列表中每個專案的變數時,請使用一個描述專案用途的名稱。例如,不要使用 x 或 i,而要使用 filename 或 counter 之類的名稱。

在變數引用周圍使用引號

在引用儲存列表中每個專案的變數時,始終在引用周圍使用引號,以確保指令碼即使在專案包含空格或其他特殊字元時也能正常工作。

對於複雜的迭代,使用計數器變數

當遍歷多個列表或在迴圈中執行復雜計算時,請使用單獨的計數器變數來跟蹤當前迭代編號。這可以使迴圈更易於閱讀和除錯。

避免無限迴圈

始終確保您的迴圈具有明確的終止條件,以避免無限迴圈。例如,如果您正在遍歷數字範圍,請確保迴圈在到達範圍末尾時終止。

在必要時使用條件語句

如果您需要根據某個條件跳過某些迭代或提前終止迴圈,請使用 if 和 break 等條件語句來控制迴圈的流程。

透過遵循這些技巧,您可以編寫更高效、更有效的 Bash for 迴圈,從而快速準確地完成您的任務。

結論

Bash for 迴圈是用於自動化 Linux 和 Unix 環境中重複性任務的強大工具。透過使用 for 迴圈,您可以輕鬆遍歷值列表、數字範圍或陣列。您還可以使用巢狀 for 迴圈同時遍歷多個列表。此外,您可以使用 continue 關鍵字根據某個條件跳過迭代。透過本文提供的示例,您應該能夠開始在自己的指令碼中使用 Bash for 迴圈,並使您的工作更有效率和簡化。

更新於: 2023年4月12日

502 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.