Linux Bash 腳本中 for 循環的 9 個示例

已發表: 2022-08-19
藍色背景下筆記本電腦上的 Linux 命令行。
fatmawati achmad zaenuri/Shutterstock.com

通用的 Bash for循環不僅僅是循環一定次數。 我們描述了它的許多變體,以便您可以在自己的 Linux 腳本中成功使用它們。

for 循環

所有腳本和編程語言都有一些處理循環的方法。 循環是您希望重複執行的一段代碼。 而不是一次又一次地在腳本中輸入相同的指令集,循環將為您一遍又一遍地重複一段代碼。

9 個 Bash 腳本示例讓您開始使用 Linux
相關9 個 Bash 腳本示例讓您開始使用 Linux

Bash for循環非常靈活。 它可以處理數字、單詞、數組、命令行變量或其他命令的輸出。 這些用於循環的頭部。 標頭指示循環正在處理的內容(例如數字或字符串)以及將停止循環的結束條件。

循環包含您想要重複的代碼。 它包含您希望循環執行的操作。 循環體可以包含任何有效的腳本命令。

稱為循環計數器或迭代器的變量用於逐步遍歷一系列值或數據項列表。 對於每個循環,迭代器獲取下一個數字、字符串或循環正在迭代的任何數據類型的值。 這允許循環依次處理每個數據項的值,甚至在某些情況下可以操作數據項本身。

簡單的 for 循環

如果您正在尋找編寫您的第一個 for 循環,這些簡單的示例將幫助您入門。

使用數字列表的 for 循環

您可以在命令行上運行for循環。 此命令創建並執行一個簡單for循環。 迭代器是一個名為i的變量。 我們將依次分配i為數字列表中的每個值。 循環體將該值打印到終端窗口。 結束此循環的條件是當i遍歷整個數字列表時。

 對於 i 在 1 2 3 4 5 中; 迴聲 $i; 完畢

從 1 到 5 的 for 循環

在這裡需要注意的是,每次循環旋轉時變量i都會增加 1,但這是因為數字列表每次都會增加 1。

這個數字列表從 3 開始,以 2 為步長上升,然後任意躍升至 44。

 對於 i 在 3 5 7 9 11 44​​; 迴聲 $i; 完畢

通過非順序數字列表計數的 for 循環

它對for循環沒有影響。 它從列表的一端開始,依次使用每個值,直到列表中的所有值都被使用。

數字也不需要按升序排列。 它們可以按任何順序排列。

 對於 i 在 3 43 44 11 9; 迴聲 $i; 完畢

通過未排序的數字列表進行 for 循環計數

使用單詞列表的 for 循環

我們可以很容易地用文字做同樣的事情。 將腳本文本複製到編輯器中並將其保存為“word-list.sh”。

 #!/bin/bash

for word in 這是一個單詞序列
做 
  迴聲$字
完畢

您需要使用chmod使腳本可執行,以及從本文中復制的任何其他腳本。 每次使用chmod命令時,只需替換腳本的名稱即可。

 chmod +x 單詞列表.sh 

使用 chmod 使腳本可執行

讓我們運行腳​​本。

 ./word-list.sh 

遍歷單詞列表的 for 循環

就像對數字所做的那樣,迭代器(在本例中為變量word )在數據項列表中工作,直到到達列表的末尾。 循環體訪問word變量中的值,因此列表中的每個單詞都得到處理。

具有數字範圍的 for 循環

如果你想讓for循環運行 100 次,那麼必須在循環標題中輸入 100 個數字的序列將是一件非常煩人的事情。 數字範圍允許您僅指定第一個和最後一個數字。

這個腳本是“number-range.sh”。

 #!/bin/bash

對於我在 {1..10}
做
  echo "循環旋轉:" $i
完畢

數字範圍在大括號“ {} ”中定義,兩個句點“ .. ”分隔開始和結束範圍的數字。 確保在範圍定義中不包含任何空格。

它是這樣運行的:

 ./number-range.sh 

使用數字範圍的 for 循環

您可以包含另一個數字,該數字定義迭代器在遍歷該範圍內的數字時應使用的步長。 此腳本“number-range2.sh”將使用 0 到 32 的範圍,步長為 4。

 #!/bin/bash

對於我在 {0..32..4}
做
  echo "循環旋轉:" $i
完畢

迭代器以四跳的方式逐步遍歷數字範圍。

 ./number-range2.sh 

使用迭代器步長為 4 的 for 循環

使用文件名的 for 循環

因為我們可以處理單詞列表,所以我們可以讓我們的腳本使用文件名。 該腳本稱為“filenames.sh”。

 #!/bin/bash

對於 word-list.sh 中的文件 number-range.sh number-range2.sh filenames.sh
做
  ls -lh "$文件"
完畢

擁有一個只做ls可以做的腳本是毫無意義的,但它確實演示瞭如何訪問循環體內的文件名。

 ./文件名.sh 

使用文件名列表的 for 循環

與使用數字範圍類似,我們可以在循環頭中使用文件模式來指定我們要處理的文件。 這避免了大量輸入,意味著我們不需要提前知道文件的名稱。

該腳本稱為“filenames2.sh”。 我們已將文件名列表替換為文件名模式“*.sh”,以便腳本報告當前目錄中的所有腳本文件。

 #!/bin/bash

對於 *.sh 中的文件
做
  ls -lh "$文件"
完畢

這是輸出。

 ./filenames2.sh 

使用 *.sh 文件模式的 for 循環

使用命令行參數的 for 循環

我們可以通過在命令行中傳入文件名模式來增加一些靈活性。 $*變量代表傳遞給腳本的所有命令行參數。

這是“filenames3.sh”。

 #!/bin/bash

對於 $* 中的文件
做
  ls -lh "$文件"
完畢

我們將要求以“n”開頭並具有 SH 擴展名的文件名。

 ./filenames3.sh n*.sh 

將文件模式作為命令行參數的 for 循環

我們也可以一次傳入多個模式。

 ./filenames3.sh n*.sh .bashrc 

採用文件模式和文件名的命令行參數的 for 循環

迭代器變量file採用每個命令行參數的值。 文件名模式被擴展,所有文件名都在循環體中處理。

相關:如何在 Bash 中使用變量

類似 C 的 for 循環

Bash 支持經典的三項 for 循環,例如 C 編程語言中的循環。 它們被稱為三項 for 循環,因為循環頭中有三個項。

  • 循環迭代器的初始值。
  • 測試循環是繼續還是結束。
  • 迭代器的遞增或遞減。

這個腳本是“c-like.sh”。

迭代器I在循環開始時設置為 1,只要語句“ i<=10 ”為真,循環就會運行。 一旦i達到 11, for循環就會停止。 循環每轉一圈,迭代器就會增加一個。

 #!/bin/bash

對於 (( i=1; i<=10; i++ ))
做 
  echo "循環編號:" $i
完畢

讓我們運行這個腳本。

 ./c-like.sh 

三項或類似 C 的 for 循環

類 C 的for循環允許輕鬆創建具有稍微奇怪要求的for循環。 這個循環從 15 開始,以 3 為步倒數。這是“c-like2.sh”

 #!/bin/bash

對於 (( i=15; i>0; i-=3 ))
做 
  echo "循環編號:" $i
完畢

當我們運行它時,它應該以三步向後跳。

 ./c-like2.sh 

類似 C 的 for 循環向後計數

無限循環

您也可以使用這種格式的for循環來創建無限循環。 您需要做的就是從循環頭中刪除所有元素,就像這樣。 這是“infinite.sh”。

 #!/bin/bash

為了 (( ; ; ))
做
  echo "按 Ctrl+C 停止..."
  睡覺 1
完畢

您需要按 Ctrl+C 來停止循環。

 ./無限.sh 

一個類似 C 的無限 for 循環

使用字數組的 for 循環

我們可以輕鬆地遍歷單詞數組。 我們需要在循環頭中提供數組的名稱,迭代器將遍歷數組中的所有條目。 這是“word-array.sh”。

 #!/bin/bash

distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

$distributions 中的發行版
做
  迴聲$發行版
完畢

為我們列出了所有發行版。

 ./word-array.sh 

使用單詞數組的 for 循環

繼續命令

如果您希望循環跳過特定條目,請測試迭代器是否匹配該條目並使用continue命令。 continue命令放棄當前的循環自旋。 它遞增迭代器並開始循環的下一次旋轉——假設您要跳過的條目不是列表中的最後一項。

這是“word-array2.sh”。 它越過“Arch”數組條目,但處理所有其他數組成員。

 #!/bin/bash

distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

$distributions 中的發行版
做
  if [[ "$distro" == "Arch" ]] ;
    然後
    繼續
  菲
  迴聲$發行版
完畢

“Arch”不會出現在終端窗口中。

 ./word-array2.sh 

由於 continue 命令,for 循環跳過單詞數組中的條目

休息命令

break命令跳出循環並阻止任何更多的處理。

這是“word-array3.sh”。 它與之前的腳本相同,將continue替換為break

 #!/bin/bash

distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

$distributions 中的發行版
做
  if [[ "$distro" == "Arch" ]] ;
    然後
    休息
  菲
  迴聲$發行版
完畢

當迭代器包含“Arch”時,for 循環放棄任何處理。

 ./word-array3.sh 

由於 break 命令而放棄進一步處理的 for 循環

使用關聯數組的 for 循環

在 Bash 4 及更高版本中,關聯數組允許您創建鍵值對列表,可以通過鍵或值進行搜索。 由於鍵和值之間的雙向關係,它們也被稱為數據字典。

什麼是 Linux 上的 Bash 字典,以及如何使用它們?
相關什麼是 Linux 上的 Bash 字典,以及如何使用它們?

我們可以使用for循環遍歷關聯數組。 這個腳本是“associative.sh”。 它定義了一個關聯數組,其中有四個條目,“狗”、“貓”、“羅賓”和“人類”各有一個。 這些是關鍵。 這些值是它們各自擁有的(默認)腿數。

 #!/bin/bash

聲明 -A 動物=( [dog]=四足 [cat]=四足 [robin]=兩足 [human]=Two-legged )

${!animals[@]} 中的腿
做
  if [ ${animals[$legs]} == "Two-legged" ]; 然後 
    迴聲 ${腿}
  菲
完畢

迭代器稱為legs 。 請注意,循環頭包含一個“ ! ”感嘆號。 這不是作為邏輯 NOT 運算符,它是關聯數組語法的一部分。 需要在數組中進行搜索。

循環體執行字符串比較測試。 如果數組成員的值為“Two-legged”,它將鍵值打印到終端窗口。 當我們運行它時,腳本會打印出兩條腿的生物。

 ./associative.sh 

使用 for 循環從關聯數組中提取項目

迭代命令的輸出

如果你有一個命令或命令序列產生一個列表,比如文件名,你可以用for循環遍歷它們。 您需要注意意外的文件名擴展,但在簡單的情況下沒問題。

這個腳本是“command.sh”。 它使用lswc提供腳本文件名的排序列表,以及它們的行數、字數和字節數。

 #!/bin/bash

for i in $(ls *.sh | sort);
做 
  迴聲 $(wc $i)
完畢

當我們運行它時,我們會得到每個文件的統計信息,文件按字母順序列出。

 ./command.sh 

使用 for 循環遍歷兩個管道命令的輸出

令人眼花繚亂的 for 循環

for循環是一種通用且易於理解的腳本工具。 但儘管它很靈活,但不要忘記其他循環的存在是有原因的。 不要眼花繚亂地認為for循環就是您所需要的一切。

如何在 Linux Bash 腳本中逐行處理文件
相關如何在 Linux Bash 腳本中逐行處理文件

例如, while循環比for循環更適合某些事情,例如從文件中讀取行。

編寫好的腳本意味著使用最適合手頭任務的工具。 for循環是您的技巧工具箱中的一個很好的工具。