15.1.3 类C的for循环

Shell支持类C的for循环。了解C语言或类C语言的读者一定会对(i=1;i<=10;i++)这样的结构十分熟悉,在Shell中其语法结构如下:


  1. for ((expression1; expression2; expression3))

  2. do

  3. command

  4. done


其中,expression1为初始化语句,一般用作变量定义和初始化;expression2为判断表达式,用于测试表达式返回值并以此控制循环,返回值为真则循环继续,返回值为假时则退出循环;expression3用于变量值修改,从而影响expression2的返回值,并以此影响循环行为。下面的脚本演示了使用for语句控制的10次循环。


  1. [root@localhost ~]# cat c_for01.sh

  2. #!/bin/bash

  3. for ((i=1; i<=10; i++))

  4. do

  5. echo -n "$i "

  6. done

  7. echo

  8. #

  9. 运行结果

  10. [root@localhost ~]# bash c_for01.sh

  11. 1 2 3 4 5 6 7 8 9 10


使用类C的for循环还有其他的好处:可以在初始化expression1的同时初始化多个变量,另外,还可以在expression3中同时修改多个变量的值,每个expression中的多条语句之间使用逗号隔开。示例如下:


  1. [root@localhost ~]# cat c_for02.sh

  2. #!/bin/bash

  3. for ((i=1, j=100; i<=10; i++, j--))

  4. do

  5. echo "i=$i j=$j "

  6. done

  7. [root@localhost ~]# bash c_for02.sh

  8. i=1 j=100

  9. i=2 j=99

  10. i=3 j=98

  11. i=4 j=97

  12. i=5 j=96

  13. i=6 j=95

  14. i=7 j=94

  15. i=8 j=93

  16. i=9 j=92

  17. i=10 j=91


下面是使用类C的for循环的示例,在该示例中同时计算了1到100的和以及1到100的奇数和。


  1. [root@localhost ~]# cat c_for03.sh

  2. #!/bin/bash

  3. #sum01

  4. 用于计算1

  5. 100

  6. 的和

  7. #sum02

  8. 用于计算1

  9. 100

  10. 的奇数和

  11. sum01=0

  12. sum02=0

  13. for ((i=1, j=1; i<=100; i++, j+=2))

  14. do

  15. let "sum01+=i"

  16. #

  17. 由于j

  18. 值增长速度比i

  19. 快,所以必须在过程中测试j

  20. 值不大于100

  21. if [ $j -lt 100 ]; then

  22. let "sum02+=j"

  23. fi

  24. done

  25. echo "sum01=$sum01"

  26. echo "sum02=$sum02"

  27. #

  28. 运行结果

  29. [root@localhost ~]# bash c_for03.sh

  30. sum01=5050

  31. sum02=2500