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