15.5 嵌套循环

所谓嵌套循环指的是一个循环语句中的循环体是另外一个循环。前面讲到的for、while、until、select循环语句都可以使用嵌套循环。在嵌套循环中可以多层嵌套,但是要注意,过度的嵌套会让程序变得晦涩难懂,所以除了确实必要的情况下,不建议使用多层嵌套(三层以上的嵌套)。

下面演示使用for的嵌套循环打印九九乘法表的方法。


  1. [root@localhost ~]# cat nesting01.sh #!/bin/bash

  2. for ((i=1; i<=9; i++)) do

  3. for ((j=1; j<=9; j++)) do

  4. let "multi=$i*$j"

  5. echo -n "$i*$j=$multi "

  6. done

  7. echo

  8. done

  9. #

  10. 运行结果

  11. [root@localhost ~]# bash nesting01.sh 1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9

  12. 2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18

  13. 3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27

  14. 4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36

  15. 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45

  16. 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54

  17. 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63

  18. 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72

  19. 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81


下面使用while改写九九乘法表,其运行结果和上面是一样的。


  1. [root@localhost ~]# cat nesting02.sh #!/bin/bash

  2. i=1

  3. while [[ "$i" -le "9" ]]

  4. do

  5. j=1

  6. while [[ "$j" -le "9" ]]

  7. do

  8. let "multi=$i*$j"

  9. echo -n "$i*$j=$multi "

  10. let "j+=1"

  11. done

  12. echo

  13. let "i+=1"

  14. done

  15. #

  16. 运行结果

  17. [root@localhost ~]# bash nesting02.sh 1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9

  18. 2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18

  19. 3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27

  20. 4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36

  21. 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45

  22. 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54

  23. 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63

  24. 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72

  25. 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81


上面演示了for循环中嵌套for以及while循环嵌套while的写法,实际上不同循环之间也可以相互嵌套,比如for循环中嵌套while等。细心的读者可能已经发现,15.4节中的最后一个例子(select02.sh)其实就是一个select嵌套case的循环。