Linux Bash 腳本中 for 循環的 9 個示例
已發表: 2022-08-19 通用的 Bash for
循環不僅僅是循環一定次數。 我們描述了它的許多變體,以便您可以在自己的 Linux 腳本中成功使用它們。
for 循環
所有腳本和編程語言都有一些處理循環的方法。 循環是您希望重複執行的一段代碼。 而不是一次又一次地在腳本中輸入相同的指令集,循環將為您一遍又一遍地重複一段代碼。
Bash for
循環非常靈活。 它可以處理數字、單詞、數組、命令行變量或其他命令的輸出。 這些用於循環的頭部。 標頭指示循環正在處理的內容(例如數字或字符串)以及將停止循環的結束條件。
循環體包含您想要重複的代碼。 它包含您希望循環執行的操作。 循環體可以包含任何有效的腳本命令。
稱為循環計數器或迭代器的變量用於逐步遍歷一系列值或數據項列表。 對於每個循環,迭代器獲取下一個數字、字符串或循環正在迭代的任何數據類型的值。 這允許循環依次處理每個數據項的值,甚至在某些情況下可以操作數據項本身。
簡單的 for 循環
如果您正在尋找編寫您的第一個 for 循環,這些簡單的示例將幫助您入門。
使用數字列表的 for 循環
您可以在命令行上運行for
循環。 此命令創建並執行一個簡單for
循環。 迭代器是一個名為i
的變量。 我們將依次分配i
為數字列表中的每個值。 循環體將該值打印到終端窗口。 結束此循環的條件是當i
遍歷整個數字列表時。
對於 i 在 1 2 3 4 5 中; 迴聲 $i; 完畢
在這裡需要注意的是,每次循環旋轉時變量i
都會增加 1,但這是因為數字列表每次都會增加 1。
這個數字列表從 3 開始,以 2 為步長上升,然後任意躍升至 44。
對於 i 在 3 5 7 9 11 44; 迴聲 $i; 完畢
它對for
循環沒有影響。 它從列表的一端開始,依次使用每個值,直到列表中的所有值都被使用。
數字也不需要按升序排列。 它們可以按任何順序排列。
對於 i 在 3 43 44 11 9; 迴聲 $i; 完畢
使用單詞列表的 for 循環
我們可以很容易地用文字做同樣的事情。 將腳本文本複製到編輯器中並將其保存為“word-list.sh”。
#!/bin/bash for word in 這是一個單詞序列 做 迴聲$字 完畢
您需要使用chmod
使腳本可執行,以及從本文中復制的任何其他腳本。 每次使用chmod
命令時,只需替換腳本的名稱即可。
chmod +x 單詞列表.sh
讓我們運行腳本。
./word-list.sh
就像對數字所做的那樣,迭代器(在本例中為變量word
)在數據項列表中工作,直到到達列表的末尾。 循環體訪問word
變量中的值,因此列表中的每個單詞都得到處理。
具有數字範圍的 for 循環
如果你想讓for
循環運行 100 次,那麼必須在循環標題中輸入 100 個數字的序列將是一件非常煩人的事情。 數字範圍允許您僅指定第一個和最後一個數字。
這個腳本是“number-range.sh”。
#!/bin/bash 對於我在 {1..10} 做 echo "循環旋轉:" $i 完畢
數字範圍在大括號“ {}
”中定義,兩個句點“ ..
”分隔開始和結束範圍的數字。 確保在範圍定義中不包含任何空格。
它是這樣運行的:
./number-range.sh
您可以包含另一個數字,該數字定義迭代器在遍歷該範圍內的數字時應使用的步長。 此腳本“number-range2.sh”將使用 0 到 32 的範圍,步長為 4。
#!/bin/bash 對於我在 {0..32..4} 做 echo "循環旋轉:" $i 完畢
迭代器以四跳的方式逐步遍歷數字範圍。
./number-range2.sh
使用文件名的 for 循環
因為我們可以處理單詞列表,所以我們可以讓我們的腳本使用文件名。 該腳本稱為“filenames.sh”。
#!/bin/bash 對於 word-list.sh 中的文件 number-range.sh number-range2.sh filenames.sh 做 ls -lh "$文件" 完畢
擁有一個只做ls
可以做的腳本是毫無意義的,但它確實演示瞭如何訪問循環體內的文件名。
./文件名.sh
與使用數字範圍類似,我們可以在循環頭中使用文件模式來指定我們要處理的文件。 這避免了大量輸入,意味著我們不需要提前知道文件的名稱。
該腳本稱為“filenames2.sh”。 我們已將文件名列表替換為文件名模式“*.sh”,以便腳本報告當前目錄中的所有腳本文件。
#!/bin/bash 對於 *.sh 中的文件 做 ls -lh "$文件" 完畢
這是輸出。
./filenames2.sh
使用命令行參數的 for 循環
我們可以通過在命令行中傳入文件名模式來增加一些靈活性。 $*
變量代表傳遞給腳本的所有命令行參數。
這是“filenames3.sh”。
#!/bin/bash 對於 $* 中的文件 做 ls -lh "$文件" 完畢
我們將要求以“n”開頭並具有 SH 擴展名的文件名。
./filenames3.sh n*.sh
我們也可以一次傳入多個模式。
./filenames3.sh n*.sh .bashrc
迭代器變量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
循環允許輕鬆創建具有稍微奇怪要求的for
循環。 這個循環從 15 開始,以 3 為步倒數。這是“c-like2.sh”
#!/bin/bash 對於 (( i=15; i>0; i-=3 )) 做 echo "循環編號:" $i 完畢
當我們運行它時,它應該以三步向後跳。
./c-like2.sh
無限循環
您也可以使用這種格式的for
循環來創建無限循環。 您需要做的就是從循環頭中刪除所有元素,就像這樣。 這是“infinite.sh”。
#!/bin/bash 為了 (( ; ; )) 做 echo "按 Ctrl+C 停止..." 睡覺 1 完畢
您需要按 Ctrl+C 來停止循環。
./無限.sh
使用字數組的 for 循環
我們可以輕鬆地遍歷單詞數組。 我們需要在循環頭中提供數組的名稱,迭代器將遍歷數組中的所有條目。 這是“word-array.sh”。
#!/bin/bash distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda") $distributions 中的發行版 做 迴聲$發行版 完畢
為我們列出了所有發行版。
./word-array.sh
繼續命令
如果您希望循環跳過特定條目,請測試迭代器是否匹配該條目並使用continue
命令。 continue
命令放棄當前的循環自旋。 它遞增迭代器並開始循環的下一次旋轉——假設您要跳過的條目不是列表中的最後一項。
這是“word-array2.sh”。 它越過“Arch”數組條目,但處理所有其他數組成員。
#!/bin/bash distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda") $distributions 中的發行版 做 if [[ "$distro" == "Arch" ]] ; 然後 繼續 菲 迴聲$發行版 完畢
“Arch”不會出現在終端窗口中。
./word-array2.sh
休息命令
break
命令跳出循環並阻止任何更多的處理。
這是“word-array3.sh”。 它與之前的腳本相同,將continue
替換為break
。
#!/bin/bash distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda") $distributions 中的發行版 做 if [[ "$distro" == "Arch" ]] ; 然後 休息 菲 迴聲$發行版 完畢
當迭代器包含“Arch”時,for 循環放棄任何處理。
./word-array3.sh
使用關聯數組的 for 循環
在 Bash 4 及更高版本中,關聯數組允許您創建鍵值對列表,可以通過鍵或值進行搜索。 由於鍵和值之間的雙向關係,它們也被稱為數據字典。
我們可以使用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
循環遍歷它們。 您需要注意意外的文件名擴展,但在簡單的情況下沒問題。
這個腳本是“command.sh”。 它使用ls
和wc
提供腳本文件名的排序列表,以及它們的行數、字數和字節數。
#!/bin/bash for i in $(ls *.sh | sort); 做 迴聲 $(wc $i) 完畢
當我們運行它時,我們會得到每個文件的統計信息,文件按字母順序列出。
./command.sh
令人眼花繚亂的 for 循環
for
循環是一種通用且易於理解的腳本工具。 但儘管它很靈活,但不要忘記其他循環的存在是有原因的。 不要眼花繚亂地認為for
循環就是您所需要的一切。
例如, while
循環比for
循環更適合某些事情,例如從文件中讀取行。
編寫好的腳本意味著使用最適合手頭任務的工具。 for
循環是您的技巧工具箱中的一個很好的工具。