Bash 脚本 for 循环示例讲解

linuxbashopen source更新于 2026/2/4 6:37:17

如果您是 Linux 或 Unix 用户,您很可能至少使用过一两次 Bash。Bash 是一个命令行 Shell,它允许您以比图形用户界面更直接、更强大的方式与操作系统交互。Bash 最强大的功能之一是 for 循环,它允许您通过迭代值列表来自动执行重复性任务。在本文中,我们将探讨 Bash for 循环的工作原理,并提供一些如何在您自己的脚本中使用它的示例。

什么是 For 循环?

for 循环是一种控制结构,它允许您以固定的次数或对值列表重复执行代码块。for 循环的基本语法如下:

for variable in list
do
   commands
done

这里,variable 是一个占位符,它依次接受列表中每个项目的值;commands 是一个 Bash 命令块,每次循环运行时都会执行这些命令。循环会一直执行,直到列表中的每个项目都处理完毕。

迭代值列表

for 循环最简单的用例是迭代值列表。假设您在目录中有一个文件名列表,并且您想将每个文件名打印在单独的行上。您可以这样做:-

for file in /path/to/directory/*
do
   echo $file
done

在此示例中,我们使用通配符 * 来指定要循环遍历目录中的所有文件。echo 命令用于在单独的行上打印每个文件名。请注意,我们在调用 echo 时使用 $ 符号来引用文件变量。

遍历一系列数字

for 循环的另一个常见用例是遍历一系列数字。假设您想在单独的行上打印 1 到 10 的数字。以下是操作方法 -

示例

for i in {1..10}
do
   echo $i
done

在此示例中,我们使用花括号 {} 来指定要循环的数字范围。echo 命令用于在单独的行上打印出每个数字。

输出

1
2
3
4
5
6
7
8
9
10

迭代数组

在 Bash 中,您还可以创建数组,将多个值存储在单个变量中。以下示例演示如何使用 for 循环迭代名称数组 -

示例

names=("Alice" "Bob" "Charlie" "Dave")

for name in "${names[@]}"
do
   echo "Hello, $name!"
done

输出

Hello, Alice!
Hello, Bob!
Hello, Charlie!
Hello, Dave!

在本例中,我们定义了一个名为 names 的数组,其中包含四个值。"${names[@]}"语法用于将数组扩展为一个值列表,for 循环可以对其进行迭代。echo 命令用于打印每个名称的问候语。

嵌套 for 循环

有时您可能需要在一个 for 循环内嵌套另一个 for 循环。这称为嵌套 for 循环。假设您有一个文件扩展名列表和一个目录列表,并且您希望循环遍历每个扩展名和目录的组合。您可以这样做 -

示例

extensions=("txt" "pdf" "docx")
directories=("/path/to/dir1" "/path/to/dir2" "/path/to/dir3")

for ext in "${extensions[@]}"
do
   for dir in "${directories[@]}"
   do
      echo "Files with extension .$ext in $dir:"
         ls "$dir"/*.$
      .$ext
   done
done

在此示例中,我们定义了两个名为"extensions"和"directories"的数组。我们使用嵌套的 for 循环来迭代每个扩展名和目录的组合。"echo"命令用于打印一条消息,指示正在处理的扩展名和目录,而"ls"命令用于列出目录中当前扩展名的所有文件。

使用 Continue 跳过迭代

有时,您可能希望根据特定条件跳过 for 循环的迭代。这可以使用"continue"关键字来实现。假设您有一个文件名列表,并且您想打印出除以字母"a"开头的文件之外的所有文件名。您可以这样做 -

for file in /path/to/directory/*
do
if [[ "$file" == /path/to/directory/a* ]]; then
   continue
fi
   echo $file
done

在本例中,我们使用 `if` 语句检查文件名是否以字母"a"开头。如果是,则使用 `continue` 关键字跳过循环中的其余代码并继续执行下一次迭代。如果文件名不以"a"开头,则使用 `echo` 命令打印文件名。

高级 For 循环技巧

除了 for 循环的基本语法外,Bash 还提供了许多高级技巧,可用于使 for 循环更加强大和灵活。以下是一些示例 -

将命令输出用作列表

您可以将命令输出用作列表,以便在 for 循环中进行迭代。假设您想打印出主目录中所有包含 10 个以上文件的目录。以下是操作方法 -

for dir in $(find ~/ -type d -exec sh -c 'ls -1 "{}" | wc -l' \; -print | awk -F: '$1>=10 {print $2}')
do
   echo $dir
done

在此示例中,我们使用 find 命令查找主目录中的所有目录。然后,我们结合使用 sh、ls、wc 和 awk 命令来计算每个目录中的文件数量,并过滤掉文件数量少于 10 个的目录。最终得到的目录列表将作为 for 循环的输入。

使用 C 风格的 For 循环

Bash 还提供了一种使用 C 风格的 for 循环语法的方法,这对于更复杂的循环场景非常有用。以下是一个例子 -

示例

for ((i=0; i<10; i++))
do
   echo $i
done

输出

0
1
2
3
4
5
6
7
8
9

在本例中,我们使用 ((...)) 语法定义一个 C 风格的 for 循环,该循环从 0 计数到 9。i++ 表达式用于在每次循环运行时将 i 的值加 1。

将 While 循环与 Read 命令结合使用

最后,您可以使用 while 循环与 read 命令结合使用,遍历用户输入的值列表。以下是示例 -

while read line
do
   echo "You entered: $line"
done

在本例中,我们使用 read 命令读取用户输入的一行文本。while 循环持续运行,直到用户输入文件结束符(通常为 Ctrl+D)。 echo 命令用于打印用户输入的每一行文本。

高效使用 Bash for 循环的技巧

虽然 Bash for 循环功能强大,但还是有一些技巧和窍门可以帮助你提升循环效率。以下是使用 Bash for 循环时需要注意的事项:

使用描述性变量名

定义用于保存列表中每个项目的变量时,请使用能够描述项目用途的名称。例如,不要使用 x 或 i,而要使用类似 filename 或 counter 的名称。

使用引号将变量引用括起来

引用包含列表中每个项目的变量时,请务必使用引号将引用括起来,以确保即使项目包含空格或其他特殊字符,脚本也能正常工作。

使用计数器变量进行复杂迭代

在循环中迭代多个列表或执行复杂计算时,请使用单独的计数器变量来跟踪当前迭代次数。这可以使循环更易于阅读和调试。

避免无限循环

始终确保循环具有明确的终止条件,以避免无限循环。例如,如果您要迭代一系列数字,请确保循环在到达范围末尾时终止。

必要时使用条件语句

如果您需要根据特定条件跳过某些迭代或提前终止循环,请使用 if 和 break 等条件语句来控制循环流程。

遵循这些技巧,您可以编写更高效的 Bash for 循环,快速准确地完成任务。

结论

Bash for 循环是 Linux 和 Unix 环境中自动执行重复性任务的强大工具。使用 for 循环,您可以轻松地迭代值列表、数字范围或数组。您还可以使用嵌套 for 循环同时迭代多个列表。此外,您还可以使用"continue"关键字根据特定条件跳过迭代。通过本文提供的示例,您应该能够开始在自己的脚本中使用 Bash for 循环,并使您的工作更加高效和简化。


相关文章


有用资源