简介
假设你需要给 1,000 封信签名。签一封很容易,但签 1,000 封既无聊又伤手。在编程中,我们不喜欢无聊的重复工作。
为了解决这个问题,我们使用循环。循环可以告诉计算机:重复执行某项操作,可以是处理列表中的每个项目,也可以是一直执行到某个条件发生变化。
循环是自动化的核心,因为计算机擅长重复操作,而人类不擅长。如果你发现自己一次又一次地执行相同的命令模式,通常就说明这里适合使用循环。
在本实验中,你将构建自己的数字化流水线:
- 计数器:替你计数的循环(
for循环)。 - 执行器:处理一堆文件中每个文件的循环(处理文件的
for循环)。 - 监视器:持续工作,直到达到目标的循环(
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 根据条件运行。
总结
你已经构建了自己的第一批自动化引擎。
在本实验中,你掌握了:
- 检查清单(
for):处理已定义的项目列表,例如数字{1..5}。 - 批处理器(
for *.txt):自动处理目录中的每个文件。 - 恒温器(
while):重复执行操作,直到达到特定目标或限制。
这些循环是脚本编程的主力工具。它们可以将 1,000 次手动点击变成计算机 1 秒钟的工作。



