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
循环是您的技巧工具箱中的一个很好的工具。