11.1 循环

循环是当循环控制条件为真时,一系列命令迭代执行的代码块。

for 循环

for arg in [list]

这是 shell 中最基本的循环结构,它与C语言形式的循环有着明显的不同。

for arg in [list]
do
  command(s)...
done

note 在循环的过程中,arg 会从 list 中连续获得每一个变量的值。

for arg in "$var1" "$var2" "$var3" ... "$varN"
# 第一次循环中,arg = $var1
# 第二次循环中,arg = $var2
# 第三次循环中,arg = $var3
# ...
# 第 N 次循环中,arg = $varN

# 为了防止可能的字符分割问题,[list] 中的参数都需要被引用。

参数 list 中允许含有 通配符

如果 dofor 写在同一行时,需要在 list 之后加上一个分号。

for arg in [list] ; do

样例 11-1. 简单的 for 循环

[list] 中的每一个元素中都可能含有多个参数。这在处理参数组中非常有用。在这种情况下,使用 set 命令(查看 样例 15-16)强制解析 [list] 中的每一个元素,并将元素的每一个部分分配给位置参数。

样例 11-2. for 循环 [list] 中的每一个变量有两个参数的情况

一个单一变量也可以成为 for 循环中的 [list]。

样例 11-3. 文件信息:查看一个单一变量中含有的文件列表的文件信息

for 循环中的 [list] 可以是一个参数。

样例 11-4. 操作含有一系列文件的参数

如果在匹配文件扩展名的 for 循环中的 [list] 含有通配符(* 和 ?),那么将会进行文件名扩展。

样例 11-5. 在 for 循环中操作文件

如果在 for 循环中省略 in [list] 部分,那么循环将会遍历位置参数($@)。样例 A-15 中使用到了这一点。也可以查看 样例 15-17

样例 11-6. 缺少 in [list]for 循环

可以在 for 循环中使用 命令代换 生成 [list]。查看 样例 16-54样例 11-11样例 16-48

样例 11-7. 在 for 循环中使用命令代换生成 [list]

下面是使用命令代换生成 [list] 的更加复杂的例子。

样例 11-8. 一种替代 grep 搜索二进制文件的方法

下面的例子同样展示了如何使用命令代换生成 [list]。

样例 11-9. 列出系统中的所有用户

另外一个关于 [list] 的例子也来自于命令代换。

样例 11-10. 检查目录中所有二进制文件的原作者

最后一个关于 [list] 和命令代换的例子,但这个例子中的命令是一个函数

for 循环的结果可以通过管道导向至一个或多个命令中。

样例 11-11. 列出目录中的所有符号链接。

只需要对上一个样例做一些小小的改动,就可以把在标准输出 stdout 中的循环 重定向 到文件中。

样例 11-12. 将目录中的所有符号链接保存到文件中。

还有另外一种看起来非常像C语言中循环那样的语法。你需要使用到 双圆括号 语法。

样例 11-13. C语言风格的循环

还可以查看 样例 27-16样例 27-17样例 A-6

---

接下来,我们将展示在真实环境中应用的循环。

样例 11-14. 在批处理模式下使用 efax

note 关键字 dodone 圈定了 for 循环代码块的范围。但是在一些特殊的情况下,也可以被 大括号 取代。

while 循环

while 循环结构会在循环顶部检测循环条件,若循环条件为真( 退出状态 为0)则循环持续进行。与 for 循环 不同的是,while 循环是在不知道循环次数的情况下使用的。

while 循环结构中,你不仅可以使用像 if/test 中那样的 括号结构,也可以使用用途更广泛的 双括号结构while [[ condition ]])。

就像在 for 循环中那样,将 do 和循环条件放在同一行时需要加一个分号。

while [ condition ] ; do

while 循环中,括号结构 并不是必须存在的。比如说 getopts 结构

样例 11-15. 简单的 while 循环

样例 11-16. 另一个例子

一个 while 循环可以有多个测试条件,但只有最后的那一个条件决定了循环是否终止。这是一种你需要注意到的不同于其他循环的语法。

样例 11-17. 多条件 while 循环

就像 for 循环一样, while 循环也可以使用双圆括号结构写得像C语言那样(也可以查看样例 8-5)。

样例 11-18. C语言风格的 while 循环

在测试部分,while 循环可以调用 函数

if 测试 结构一样,while 循环也可以省略括号。

while 循环中结合 read 命令,我们就得到了一个非常易于使用的 while read 结构。它可以用来读取和解析文件。

notewhile 循环后面可以通过 < 将标准输入 重定位到文件 中。 while 循环同样可以 通过管道 传入标准输入中。

until

while 循环相反,until 循环测试其顶部的循环条件,直到其中的条件为真时停止。

注意到,跟其他的一些编程语言不同,until 循环的测试条件在循环顶部。

就像在 for 循环中那样,将 do 和循环条件放在同一行时需要加一个分号。

until[ condition-is-true ] ; do

样例 11-19. until 循环

如何在 forwhileuntil 之间做出选择?我们知道在C语言中,在已知循环次数的情况下更加倾向于使用 for 循环。但是在Bash中情况可能更加复杂一些。Bash中的 for 循环相比起其他语言来说,结构更加松散,使用更加灵活。因此使用你认为最简单的就好。

Last updated

Was this helpful?