结构化命令 之 嵌套循环

本篇内容均摘自《Linux命令行与shell脚本编程大全》,个人认为需要重点学习的章节。【免费】Linux命令行与Shell脚本编程大全 第3版 PDF全本 21MB 百度网盘下载 - 今夕是何夕 - 博客园
循环语句可以在循环内使用任意类型的命令,包括其他循环命令。这种循环叫作嵌套循环( nested loop)。注意,在使用嵌套循环时,你是在迭代中使用迭代,与命令运行的次数是乘积关系。不注意这点的话,有可能会在脚本中造成问题。
这里有个在for循环中嵌套for循环的简单例子:

$ cat test14
#!/bin/bash
for (( a = 1; a <= 3; a++ ))
do
  echo "Starting loop $a:"
    for (( b = 1; b <= 3; b++ ))
    do
      echo "  Inside loop: $b"
    done
done
$ ./test14
Starting loop 1:
  Inside loop: 1
  Inside loop: 2
  Inside loop: 3
Starting loop 2:
  Inside loop: 1
  Inside loop: 2
  Inside loop: 3
Starting loop 3:
  Inside loop: 1
  Inside loop: 2
  Inside loop: 3

这个被嵌套的循环(也称为内部循环, inner loop)会在外部循环的每次迭代中遍历一次它所有的值。注意,两个循环的do和done命令没有任何差别。 bash shell知道当第一个done命令执行时是指内部循环而非外部循环。
在混用循环命令时也一样,比如在while循环内部放置一个for循环:

$ cat test15
#!/bin/bash
var1=5
while [ $var1 -ge 0 ]
do
  echo "Outer loop: $var1"
    for (( var2 = 1; $var2 < 3; var2++ ))
    do
      var3=$[ $var1 * $var2 ]
      echo "  Inner loop: $var1 * $var2 = $var3"
    done
  var1=$[ $var1 - 1 ]
done
$ ./test15
Outer loop: 5
  Inner loop: 5 * 1 = 5
  Inner loop: 5 * 2 = 10
Outer loop: 4
  Inner loop: 4 * 1 = 4
  Inner loop: 4 * 2 = 8
Outer loop: 3
  Inner loop: 3 * 1 = 3
  Inner loop: 3 * 2 = 6
Outer loop: 2
  Inner loop: 2 * 1 = 2
  Inner loop: 2 * 2 = 4
Outer loop: 1
  Inner loop: 1 * 1 = 1
  Inner loop: 1 * 2 = 2
Outer loop: 0
  Inner loop: 0 * 1 = 0
  Inner loop: 0 * 2 = 0

同样, shell能够区分开内部for循环和外部while循环各自的do和done命令。
如果真的想挑战脑力,可以混用until和while循环。

$ cat test16
#!/bin/bash
var1=3
until [ $var1 -eq 0 ]
do
  echo "Outer loop: $var1"
  var2=1
    while [ $var2 -lt 5 ]
    do
      var3=$(echo "scale=4; $var1 / $var2" | bc)
      echo "  Inner loop: $var1 / $var2 = $var3"
      var2=$[ $var2 + 1 ]
    done
var1=$[ $var1 - 1 ]
done
$ ./test16
Outer loop: 3
  Inner loop: 3 / 1 = 3.0000
  Inner loop: 3 / 2 = 1.5000
  Inner loop: 3 / 3 = 1.0000
  Inner loop: 3 / 4 = .7500
Outer loop: 2
  Inner loop: 2 / 1 = 2.0000
  Inner loop: 2 / 2 = 1.0000
  Inner loop: 2 / 3 = .6666
  Inner loop: 2 / 4 = .5000
Outer loop: 1
  Inner loop: 1 / 1 = 1.0000
  Inner loop: 1 / 2 = .5000
  Inner loop: 1 / 3 = .3333
  Inner loop: 1 / 4 = .2500

外部的until循环以值3开始,并继续执行到值等于0。内部while循环以值1开始并一直执行,只要值小于5。每个循环都必须改变在测试条件中用到的值,否则循环就会无止尽进行下去。

你可能感兴趣的:(结构化命令 之 嵌套循环)