for循环是我们在编写Linux脚本时常用的控制语句,很多初学者在接触for循环的时候经常迷糊,因为for循环的形式真的有点多!我在学习的时候也比较犯难,以致于后来应用for循环的时候经常还要打开百度查上一查。
最近断断续续的抽时间将for循环的形式重新做了归纳,结果发现虽然for循环有各种各样的形式,但是归根结底只有两种形式!
C语言风格表达式
基本结构:
for (( 初始化表达式; 条件判断表达式; 控制表达式 )) do …… done
有C语言基础的同学一看就明白。这个for循环结构先执行初始化表达式,然后在循环执行前执行条件判断表达式,如果判断表达式的值为真,再执行循环体,否则跳出循环,控制表达式在每次循环体被执行之后执行。
最简单的一个例子:
for (( i=1; i<=100; i++ )) do echo $i done
表达式可以为空,于是就有了不同的特殊效果:
- 初始化表达式为空时,要在for语句之前将循环控制变量赋值:
i=1for (( ; i<=100 ; i++ ))do……done
- 条件判断表达式为空时,for语句变成了死循环,要在循环体中设置条件跳出循环:
for ((i=1; ; i++))do if(( i>100 )); then break fi done
- 控制表达式为空时,for语句也会变成死循环,需要在循环体加入改变控制变量的操作:
for ((i=1; i<=100; ))do ((i++))done
和C语言一样,1,3表达式都可以使用逗号表达式:
for ((i=1 , j=1; i<=100; i++, j++ ))do ……done
2表达式也可以使用任何布尔表达式,只要其值非0,就执行循环体:
- 这个循环不会被执行
for (( i=1; c=0; i++ )) do echo $i if (( i>=10 )); then break fi done
- 这个循环会被执行,结果是打印1~10的数字
for (( i=1; c=1; i++ )) do echo $i if (( i>=10 )); then break fi done
for in 风格表达式
基本结构:
for 控制变量 in 列表 do …… done
这个列表可以是任何你能想到的列表:
- 直接列表:
1 2 3 4 5 a b c d e"abc" "390" "tom"
- 取值范围:
{1..100}{a..Z}
- 任何命令执行后的输出结果,支持通配符和特殊变量,以下是一些可以产生序列的命令的例子:
seq 1 1 100ls cat filelist.txtecho some_record.txt | awk '{printf"%s