for 循环与 while 循环

ShellBeginner
立即练习

简介

假设你需要给 1,000 封信签名。签一封很容易,但签 1,000 封既无聊又伤手。在编程中,我们不喜欢无聊的重复工作。

为了解决这个问题,我们使用循环。循环可以告诉计算机:重复执行某项操作,可以是处理列表中的每个项目,也可以是一直执行到某个条件发生变化。

循环是自动化的核心,因为计算机擅长重复操作,而人类不擅长。如果你发现自己一次又一次地执行相同的命令模式,通常就说明这里适合使用循环。

在本实验中,你将构建自己的数字化流水线:

  1. 计数器:替你计数的循环(for 循环)。
  2. 执行器:处理一堆文件中每个文件的循环(处理文件的 for 循环)。
  3. 监视器:持续工作,直到达到目标的循环(while 循环)。

数字循环(For 循环)

for 循环就像一张检查清单。你有一个项目列表,然后对列表中的每个项目执行某项操作。

这是类 Unix 系统中最实用的自动化模式之一。计算机非常擅长稳定地重复执行小操作,因此循环可以将只处理一个项目的任务扩展为处理多个项目的任务,而不必反复复制相同的命令。

先从最简单的列表开始:数字。让计算机从 1 数到 5。

先检查工作目录:

cd ~/project

创建名为 num_loop.sh 的脚本:

nano num_loop.sh

输入以下代码:

#!/bin/bash

for i in {1..5}; do
  echo "Number: $i"
done

解析这条流水线:

  • for i in {1..5}:这是机器的送料器。它依次取出数字 1、2、3、4、5,并逐个放入变量 $i。
  • do:启动机器。
  • echo ...:要执行的具体任务。
  • done:完成当前项目的处理,然后返回去获取下一个项目。

{1..5} 是 Bash 中一种名为大括号扩展的简写形式。在循环开始前,Bash 会将它扩展为一个值列表。因此,循环实际上是在逐个遍历一个预先准备好的列表。

保存(Ctrl+O)并退出(Ctrl+X)。

赋予脚本执行权限并运行:

chmod +x num_loop.sh
./num_loop.sh

你将看到机器人逐个输出数字:

Number: 1
Number: 2
Number: 3
Number: 4
Number: 5

文件循环(For 循环)

计数很有趣,但处理文件更加实用。将 for 循环与通配符(例如 *.txt)结合使用时,它非常强大。你可以告诉脚本:「对这个文件夹中找到的每个文本文件执行某项操作。」

我们已经在你的文件夹中创建了一些示例文本文件。现在编写一个脚本来查找这些文件。

创建名为 file_loop.sh 的新文件:

nano file_loop.sh

输入以下代码:

#!/bin/bash

echo "Listing text files:"
for file in *.txt; do
  echo "Found file: $file"
done

执行逻辑:

这次我们没有使用数字 {1..5},而是为循环提供了一个模式 *.txt。

Bash 会查看当前文件夹,找到所有匹配的文件(例如 data1.txt、notes.txt),然后将它们逐个放入名为 $file 的变量中。

匹配操作发生在循环体执行之前。Shell 会将 *.txt 扩展为一个文件名列表,然后 for 循环遍历这个列表。这就是循环和 glob 模式在 Shell 脚本中配合得非常好的原因。

保存并退出。

运行脚本:

chmod +x file_loop.sh
./file_loop.sh

输出:

Listing text files:
Found file: data1.txt
Found file: data2.txt
Found file: notes.txt

想象一下,如果你不只是使用 echo,而是使用 mv 移动这些文件,或使用 zip 将它们归档,那么只需使用同样的 4 行脚本,就可以在几秒内处理 10,000 个文件!

条件循环(While 循环)

当你有一个列表(数字列表或文件列表)时,for 循环非常适合。但如果你没有列表呢?如果你只想「持续工作,直到某件事发生」呢?

这正是While 循环的用途。它就像恒温器:「只要房间很冷,就一直开着加热器。」

编写一个手动数到 10 的脚本。

创建 while_loop.sh:

nano while_loop.sh

输入以下代码:

#!/bin/bash

counter=1

while [ $counter -le 10 ]; do
  echo "Count: $counter"
  ((counter++))
done

解析这个恒温器:

  • while [ $counter -le 10 ]:条件,即「计数器是否小于或等于 10?」
    • 如果是:进入循环。
    • 如果不是:停止。
  • ((counter++)):更新操作,将计数器加 1。注意:如果忘记这一行,计数器会永远停留在 1,脚本也会一直运行(这称为「无限循环」)!

这体现了 for 和 while 之间的关键区别。for 循环通常会在开始运行时从 Shell 获取整个序列。while 循环则依赖一个条件,并且脚本必须在运行过程中正确更新这个条件。

((counter++)) 是 Bash 的算术表示法。它告诉 Shell 将 counter 视为数字,并将其加 1。Shell 脚本经常同时处理文本和简单算术,因此你会经常看到这种语法。

保存并退出。

运行脚本:

chmod +x while_loop.sh
./while_loop.sh

它的行为与 for 循环类似,但逻辑不同。for 遍历列表,while 根据条件运行。

总结

你已经构建了自己的第一批自动化引擎。

在本实验中,你掌握了:

  1. 检查清单(for):处理已定义的项目列表,例如数字 {1..5}。
  2. 批处理器(for *.txt):自动处理目录中的每个文件。
  3. 恒温器(while):重复执行操作,直到达到特定目标或限制。

这些循环是脚本编程的主力工具。它们可以将 1,000 次手动点击变成计算机 1 秒钟的工作。