11.1 循环
循环是当循环控制条件为真时,一系列命令迭代执行的代码块。
for 循环
for arg in [list]
for arg in [list]这是 shell 中最基本的循环结构,它与C语言形式的循环有着明显的不同。
for arg in [list]
do
command(s)...
done
在循环的过程中,
arg会从list中连续获得每一个变量的值。for arg in "$var1" "$var2" "$var3" ... "$varN" # 第一次循环中,arg = $var1 # 第二次循环中,arg = $var2 # 第三次循环中,arg = $var3 # ... # 第 N 次循环中,arg = $varN # 为了防止可能的字符分割问题,[list] 中的参数都需要被引用。
参数 list 中允许含有 通配符。
如果 do 和 for 写在同一行时,需要在 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
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 结构。它可以用来读取和解析文件。
在
while循环后面可以通过 < 将标准输入 重定位到文件 中。while循环同样可以 通过管道 传入标准输入中。
until
与 while 循环相反,until 循环测试其顶部的循环条件,直到其中的条件为真时停止。
注意到,跟其他的一些编程语言不同,until 循环的测试条件在循环顶部。
就像在 for 循环中那样,将 do 和循环条件放在同一行时需要加一个分号。
until[ condition-is-true ] ; do
样例 11-19. until 循环
如何在 for,while 和 until 之间做出选择?我们知道在C语言中,在已知循环次数的情况下更加倾向于使用 for 循环。但是在Bash中情况可能更加复杂一些。Bash中的 for 循环相比起其他语言来说,结构更加松散,使用更加灵活。因此使用你认为最简单的就好。
Last updated
Was this helpful?
