Linux Bash 腳本中的 9 個 for 迴圈範例
重點
- Bash for 迴圈是一種多功能工具,可以處理數字、單字、陣列、命令列變數或其他命令的輸出。
- 簡單的 for 迴圈可與數字清單或單字清單一起使用,讓您可以為清單中的每個值重複一段程式碼。
- for 循環還可以與數字範圍、檔案名稱、命令列參數、字數組和關聯數組一起使用,為腳本任務提供靈活性。
多功能的 Bashfor
循環不僅只是循環指定的次數。我們描述了它的許多變體,以便您可以在自己的 Linux 腳本中成功使用它們。
for 迴圈
所有腳本和程式語言都有某種處理循環的方法。循環是您希望重複執行的一段程式碼。循環不會一次又一次地在腳本中輸入相同的指令集,而是一遍又一遍地重複一段程式碼。
Bashfor
循環非常靈活。它可以處理數字、單字、陣列、命令列變數或其他命令的輸出。這些在循環的標頭中使用。標頭指示循環正在處理的內容(例如數字或字串)以及停止循環的結束條件是什麼。
循環體包含您想要重複的程式碼。它保存您想要循環執行的操作。循環體可以包含任何有效的腳本命令。
稱為循環計數器或迭代器的變數用於逐步遍歷一系列值或資料項清單。對於每個循環,迭代器採用下一個數字、字串或循環迭代的任何資料類型的值。這允許循環依次處理每個資料項的值,甚至在某些情況下操作資料項本身。
簡單的 for 循環
如果您想編寫第一個 for 循環,這些簡單的範例將幫助您入門。
使用數字清單的 for 迴圈
您可以for
在命令列上運行循環。該命令創建並執行一個簡單的for
循環。迭代器是一個名為 的變數i
。我們將i
依序分配數字列表中的每個值。循環體將將該值列印到終端機視窗。結束此循環的條件是i
迭代整個數字列表的時間。
for i in 1 2 3 4 5; do echo $i; done
i
這裡要注意的是,每次循環旋轉時變數都會增加 1,但這是因為數字列表每次都會增加 1。
這個數字列表從 3 開始,以 2 為步長,然後任意跳躍到 44。
for i in 3 5 7 9 11 44; do echo $i; done
這對循環沒有影響for
。它從清單的一端開始,依序使用每個值,直到清單中的所有值都已使用。
這些數字也不需要依升序排列。它們可以按任何順序排列。
for i in 3 43 44 11 9; do echo $i; done
使用單字清單的 for 循環
我們也可以輕鬆地用語言做同樣的事情。將腳本文字複製到編輯器中並將其另存為“word-list.sh”。
#!/bin/bashfor word in This is a sequence of wordsdo echo $worddone
您需要使用chmod
該腳本以及從本文複製的任何其他腳本來使該腳本可執行。每次使用該命令時只需替換腳本的名稱即可chmod
。
chmod +x word-list.sh
讓我們運行該腳本。
./word-list.sh
就像處理數字一樣,迭代器(在本例中為變數)word
會遍歷資料項列表,直到到達列表末端。循環體存取變數中的值word
,因此列表中的每個單字都會被處理。
具有數字範圍的 for 循環
如果您希望for
循環運行 100 次,那麼必須在循環標題中輸入 100 個數字的序列將是一件非常煩人的事情。數字範圍可讓您僅指定第一個和最後一個數字。
該腳本是“number-range.sh”。
#!/bin/bashfor i in {1..10}do echo "Loop spin:" $idone
數字範圍在大括號“”內定義,{}
並用兩個句點“ ..
”分隔範圍開始和結束的數字。確保範圍定義中不包含任何空格。
它是這樣運作的:
./number-range.sh
您可以包含另一個數字,該數字定義迭代器用於遍歷範圍內的數字的步長。該腳本「number-range2.sh」將使用 0 到 32 的範圍,步長為 4。
#!/bin/bashfor i in {0..32..4}do echo "Loop spin:" $idone
迭代器以四次跳躍的方式遍歷數字範圍。
./number-range2.sh
使用檔案名稱的 for 循環
因為我們可以處理單字列表,所以我們可以讓腳本使用檔案名稱。該腳本稱為“filenames.sh”。
#!/bin/bashfor file in word-list.sh number-range.sh number-range2.sh filenames.shdo ls -lh "$file"done
如果腳本只做能做的事情,那是毫無意義的ls
,但它確實演示瞭如何存取循環體內的檔案名稱。
./filenames.sh
與使用數字範圍類似,我們可以在循環頭中使用文件模式來指定我們要處理的文件。這避免了大量的輸入,並且意味著我們不需要事先知道文件的名稱。
該腳本稱為“filenames2.sh”。我們已將檔案名稱清單替換為檔案名稱模式“*.sh”,以取得目前目錄中所有腳本檔案的腳本報告。
#!/bin/bashfor file in *.shdo ls -lh "$file"done
這是輸出。
./filenames2.sh
使用命令列參數的 for 循環
我們可以透過在命令列上傳遞檔案名稱模式來增加更多的靈活性。該$*
變數表示傳遞給腳本的所有命令列參數。
這是「filenames3.sh」。
#!/bin/bashfor file in $*do ls -lh "$file"done
我們將要求提供以“n”開頭並具有 SH 副檔名的檔案名稱。
./filenames3.sh n*.sh
我們還可以一次傳遞多個模式。
./filenames3.sh n*.sh. bashrc
迭代器變數file
採用每個命令列參數的值。檔案名稱模式被擴展,並且所有檔案名稱都在循環體中處理。
類似 C 語言的 for 循環
Bash 支援經典的三個 for 循環,例如 C 程式語言中的循環。它們被稱為三項 for 循環,因為循環頭中有三項。
- 循環迭代器的初始值。
- 測試循環是繼續還是結束。
- 迭代器的遞增或遞減。
該腳本是“c-like.sh”。
迭代器I
在循環開始時設定為 1,只要語句“ i<=10
”為真,循環就會運作。一旦i
達到 11,for
循環就會停止。循環每轉一圈,迭代器會增加一個。
#!/bin/bashfor ((i=1; i<=10; i++))do echo "Loop number:" $idone
讓我們運行這個腳本。
./c-like.sh
類似 C 的for
循環允許輕鬆創建for
具有稍微奇怪要求的循環。這個循環從 15 開始,並以 3 為步長向後計數。這是“c-like2.sh”
#!/bin/bashfor ((i=15; i>0; i-=3))do echo "Loop number:" $idone
當我們運行它時,它應該以三個步驟向後跳。
./c-like2.sh
無限 for 循環
您也可以使用這種循環格式for
來建立無限循環。您需要做的就是從循環頭中刪除所有元素,如下所示。這是“infinite.sh”。
#!/bin/bashfor ((; ;))do echo "Press Ctrl+C to stop..." sleep 1done
您需要按 Ctrl+C 來停止循環。
./infinite.sh
使用字數組的 for 迴圈
我們可以輕鬆地遍歷單字數組。我們需要在循環頭中提供數組的名稱,迭代器將遍歷數組中的所有條目。這是“word-array.sh”。
#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo echo $distrodone
所有發行版均已為我們列出。
./word-array.sh
繼續命令
如果您希望循環跳過特定條目,請測試迭代器是否與該條目相符並使用該continue
命令。該continue
命令放棄循環的當前旋轉。它會遞增迭代器並開始循環的下一次旋轉 – 假設您要跳過的條目不是清單中的最後一項。
這是“word-array2.sh”。它跳過“Arch”數組條目,但處理所有其他數組成員。
#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo if [[ "$distro" == "Arch" ]] ; then continue fi echo $distrodone
“Arch”不會出現在終端機視窗中。
./word-array2.sh
中斷命令
該break
命令會跳出循環並阻止更多處理。
這是“word-array3.sh”。它與前面的腳本相同,只是continue
替換為break
。
#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo if [[ "$distro" == "Arch" ]] ; then break fi echo $distrodone
當迭代器包含“Arch”時,for 迴圈將放棄任何更多處理。
./word-array3.sh
使用關聯數組的 for 循環
在 Bash 4 及更高版本中,關聯數組可讓您建立可按鍵或按值搜尋的鍵值對清單。由於鍵和值之間存在雙向關係,因此它們也稱為資料字典。
我們可以使用循環遍歷關聯數組for
。該腳本是「associative.sh」。它定義了一個關聯數組,其中包含四個條目,每個條目對應「狗」、「貓」、「知更鳥」和「人」。這些是鍵。這些值是它們各自擁有的腿數(預設)。
#!/bin/bashdeclare -A animals=([dog]=Four-legged [cat]=Four-legged [robin]=Two-legged [human]=Two-legged)for legs in ${!animals[@]}do if [ ${animals[$legs]} == "Two-legged" ]; then echo ${legs} fidone
迭代器稱為legs
. 請注意,循環頭包含一個“ !
”感嘆號。這並不充當邏輯 NOT 運算符,它是關聯數組語法的一部分。需要在數組中進行查找。
循環體執行字串比較測試。如果陣列成員的值為“Two-legged”,則將鍵值列印到終端機視窗。當我們運行它時,腳本會列印兩條腿的生物。
./associative.sh
迭代命令的輸出
如果您有一個命令或命令序列可以產生某些內容(例如檔案名稱)的列表,則可以使用循環來迭代它們for
。您需要注意意外的檔案名稱擴展,但在簡單的情況下這是可以的。
該腳本是「command.sh」。它使用ls
和wc
提供腳本檔案名稱的排序列表,以及它們的行數、字數和位元組數。
#!/bin/bashfor i in $(ls *.sh | sort);do echo $(wc $i)done
當我們運行它時,我們會獲得每個文件的統計信息,其中文件按字母順序列出。
./command.sh
令人眼花撩亂的 for 循環
循環for
是一種多功能且易於理解的腳本工具。但儘管它很靈活,但不要忘記其他循環的存在是有原因的。不要迷惑地認為循環for
就是您所需要的一切。
例如,循環while
比循環更適合某些事情for
,例如從文件中讀取行。
編寫好的腳本意味著使用最適合手邊任務的工具。循環for
是你的技巧工具箱中的一個很棒的工具。
發佈留言