Shell 教程:編寫 BASH 'for'循環(huán)的正確姿勢
本文我們要學(xué)會什么
- 在 Bash for循環(huán)中, do和done之間的所有語句對列表或數(shù)字范圍中的每個項(xiàng)目執(zhí)行一次。
- 對于大列表,使用in {list} 在起點(diǎn)和終點(diǎn)之間循環(huán)。使用省略號迭代整個數(shù)字范圍,例如{1..10} 中的數(shù)字。
- 要跳過某些數(shù)字,請?jiān)诜秶鷥?nèi)添加第三個數(shù)字。例如,使用{0..100..10}僅列出每 10 個數(shù)字。
在編程或腳本語言中,Bash 提供了幾種重復(fù)代碼的方法 - 稱為循環(huán)的過程 - 其中 for 循環(huán)重復(fù)代碼的某個部分。這允許運(yùn)行一系列命令,直到滿足特定條件。在本指南中,我們將向您介紹如何編寫 Bash for 循環(huán)。
如何循環(huán)遍歷列表
諸如 Bash 之類的腳本語言具有與其他語言相似的編程結(jié)構(gòu)。例如,導(dǎo)入?yún)?shù)從鍵盤獲取輸入并將這些輸入存儲為變量,然后根據(jù)輸入?yún)?shù)的值執(zhí)行特定操作。
下面是一個名為linuxmi.sh 的簡單示例腳本:
for number in 1 2 3 4 5
do
echo $number
done
exit 0
Bash 使用for循環(huán)的方式與其他編程和腳本語言處理for循環(huán)的方式有些不同。讓我們分解腳本。
在 BASH for循環(huán)中,do和done之間的所有語句對列表中的每個項(xiàng)目都執(zhí)行一次。在此示例中,列表是in單詞之后的所有內(nèi)容— 數(shù)字1 2 3 4 5。
每次循環(huán)迭代時,列表中的下一個值將插入到單詞for之后指定的變量中。在上面的循環(huán)中,變量被稱為number。
echo語句 在屏幕上顯示信息。因此,此示例采用數(shù)字 1 到 5,并將每個數(shù)字一一輸出到屏幕:
如何在起點(diǎn)和終點(diǎn)之間循環(huán)
這個 linuxmi.sh 腳本的問題在于,如果您想處理一個更大的列表(例如,1 到 500),則鍵入所有數(shù)字將花費(fèi)很長時間。相反,指定一個起點(diǎn)和終點(diǎn)就簡單了:
for number in {1..10}
do
echo "$number "
done
exit 0
規(guī)則是一樣的。in這個詞后面的值組成了要迭代的列表,列表中的每個值都放在變量(即number)中,每次循環(huán)迭代時,都會執(zhí)行do和done之間的語句。
主要區(qū)別在于列表的形成方式。大括號表示一個范圍,在本例這種情況下,范圍是 1 到 10(兩個點(diǎn)分隔范圍的開始和結(jié)束)。
因此,此示例遍歷 1 到 10 之間的每個數(shù)字并將該數(shù)字輸出到屏幕。如下:
相同的循環(huán)可以這樣編寫,語法與第一個示例相同:
for number in 1 2 3 4 5 6 7 8 9 10
如何跳過范圍內(nèi)的數(shù)字
前面的示例展示了如何在起點(diǎn)和終點(diǎn)之間循環(huán)。以下是如何跳過范圍內(nèi)的數(shù)字。
例如,要在 0 和 100 之間循環(huán),但只顯示 10 的倍數(shù)的數(shù)字,請使用以下腳本獲取此輸出:
for number in {0..100..10}
do
echo "$number "
done
exit 0
規(guī)則是一樣的。在do和done之間有一個列表、一個變量和一組要執(zhí)行的語句。這次的列表如下所示:{0..100..10}。
大括號中第一個數(shù)字是 0,結(jié)束數(shù)字是 100。第三個數(shù)字 (10) 是列表中將跳過的項(xiàng)目數(shù)。
因此,上面的示例顯示以下輸出:
一個實(shí)際的例子
For 循環(huán)不僅僅迭代數(shù)字列表。例如,使用其他命令的輸出作為列表。
以下示例顯示如何將音頻文件從MP3轉(zhuǎn)換為WAV:
for file in ./*.mp3
do
mpg -w ./wavs/"${file}".wav "$file"
done
此示例中的列表是當(dāng)前文件夾中每個擴(kuò)展名為 .MP3 的文件,變量是一個文件。
mpg 命令將 MP3 文件轉(zhuǎn)換為 WAV。但是,您可能需要先使用包管理器安裝此工具。