AWK 循环
循环 用于以重复方式执行一组动作。只要循环条件为真,循环执行就会继续。
AWK 语言中也存在循环。
对标 C 语言, AWK 中也有三大循环、三大循环流程改变语句。
三大循环分别是:
for
循环while
循环do while
循环
三大循环状态变更语句分别是:
break
语句退出循环continue
终止当前迭代的执行,开始下一个迭代exit()
退出当前程序
下面,我们就一步一个脚印,慢慢的来了解下这六大语句。
for
循环
for
循环还是那个 for 循环,简直一点变化都没有。
AWK 中的 for 循环语法格式如下
for (initialization; condition; increment/decrement) action
不得不吐槽,还是有变化的,就是,少了 大括号
{}
我们来看看这个标准的 for
循环。
- for 循环的小括号内总共包含三大块语句,和两个必选的 分号
;
,三个语句都是可以省略的。 - 第一个语句称之为:初始化语句。只要执行一些初始化操作,比如初始化 循环变量。
- 第二个语句称之为:循环判断语句。也就是 检查条件,确定是否有必要进行下一次循环。
- 第三个语句称之为:循环变量递增语句。一般情况下用于递增循环变量。
- 当循环判断语句返回 true ,也就是当前循环允许被执行,那么就会执行后面的 action 语句块。
整个 for 循环,只要 循环判断语句 一直返回 true,那么它就一直循环下去,永不退出。
第二个,我们要讲诉的是小括号内三大语句的执行时机。
- 初始化语句 在整个循环开始前执行,而且只会执行一次。
- 循环判断语句 会在每次循环前执行,如果不满足条件则退出整个循环,如果满足条件则执行 action
- 循环变量递增语句 会在每次循环结束后执行,用于递增循环变量。
好了,for 循环语句差不多就这些知识了,下面我们使用一个范例来演示一下
范例
下面的范例使用 for 循环语句输出 1 2 3 4 5 5个数字
[www.twle.cn]$ awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'
运行以上 awk 命令,输出结果如下
1 2 3 4 5
while
循环
很多时候,我都在想,这些破编程语言到底要做啥啊。已经有一个 for
循环,为啥还要其它的循环语句做啥啊。
while
循环就是我所说的那个不知道为啥还存在的循环。
我们先不说 while
循环。我们先来看看刚刚那个 for 循环。大家会不会觉得这个 for 循环有点复杂啊。
三大语句:初始化语句、循环判断语句、循环变量递增语句 中只有第二个语句看起来才是每次循环必须的。
- 初始化语句 既然是在整个循环开始前执行,那么我们直接放在循环开始前就好了。
- 循环变量递增语句 既然是在每次循环结束后执行,那直接放在 action 语句中就好了,反正结果都一样。
这样想想,其实也就 循环判断语句 判断语句有点用。既然这样,我们就重新造一个关键字 while
来实现刚刚我们说的。
也即是说,while
循环语句会一直执行,直到 循环判断语句 返回 false
。
AWK 中的 while 循环语法格式如下
while (condition) action
while
循环会在每次执行前检查循环条件 condition
的值是否为 true
。只要为 true
,就会执行 action ,那么循环就会一直下去
范例
既然学会了 while 循环,那么我们就用 while 循环改写上面的 for 语句吧。
[www.twle.cn]$ awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }'
运行以上 awk 命令,输出结果如下
1 2 3 4 5
do-while
循环
到目前为止,我们已经学了两个循环了: for
循环和 while
循环。
不知道大家有没有发现,这两个循环都有有一个缺点,当然了,也是它们的有点:先判断执行。
也即是每次,包括第一次都是先判断条件,然后为 true 才执行。
但往往,有时候,我们可能需要先执行一次,然后再判断条件是否允许下一个循环。这种情况往往发正在 循环判断 条件第一次还没准备好,需要先执行一次才会准备好的情况。
针对这种情况,do-while
循环出现了。do-while
循环会先执行一次循环代码,然后在判断条件是否允许下一次执行。
do-while
循环的语法格式如下
do action while (condition)
也即是说 do-while
循环至少会执行一次 action。
范例
既然学会了 do-while 循环,那么我们就用 do-while 循环改写上面的 for 语句吧。
[www.twle.cn]$ awk 'BEGIN {i = 1; do { print i; ++i } while (i < 6) }'
运行以上 awk 命令,输出结果如下
1 2 3 4 5
break
语句
好啦好啦,我们已经学会了三大循环语句了,大家用起来感觉如何???
在日常的编程中,不知道大家有没有这样的请求,如果 action 语句块中也能退出循环就好了。
哈哈,为了响应这个请求,语言的开发者们早点就想到了这一块了,于是有了 break
语句。
也就是说 break
语句的出现,就是为了在 action 语句块中可以退出循环语句。
break
语句的语法格式如下
break;
很简洁,不拖泥带水的。
范例
小试牛刀一下,我们使用 break
语句在 sum 大于 50 就退出循环。
[www.twle.cn]$ awk 'BEGIN { sum = 0; for (i = 0; i < 20; ++i) { sum += i; if (sum > 50) break; else print "Sum =", sum } }'
运行以上 awk 命令,输出结果如下
Sum = 0 Sum = 1 Sum = 3 Sum = 6 Sum = 10 Sum = 15 Sum = 21 Sum = 28 Sum = 36 Sum = 45
continue
语句
break
语句让我们尝到了甜头,有时候我们就会突发奇想,有没有另一个关键字,不像 break
语句那样直接退出整个循环,而仅仅是退出当前循环。也就是剩下的语句不执行了,开始下一个迭代。
创造了那些语言的前辈们,自然也会有这个想法,于是造出了 continue
语句。
continue
语句,简单的说,就是停止执行剩下的语句,直接进入下一个循环。
continue
语句的语法格式如下
continue;
范例
[www.twle.cn]$ awk 'BEGIN { for (i = 1; i <= 20; ++i) { if (i % 2 == 0) print i ; else continue } }'
运行以上 awk 命令,输出结果如下
2 4 6 8 10 12 14 16 18 20
exit
语句
exit
语句是用来退出整个程序的。
既然能够退出整个程序,那自然也能退出循环。你说是不?
exit
语句用于停止脚本的执行。它接受一个整数作为参数,它是 AWK 进程的退出状态代码。
如果未提供参数,则退出返回状态 0
。
exit
语句的语法格式如下
exit [status_code]
范例
[www.twle.cn]$ awk 'BEGIN { sum = 0; for (i = 0; i < 20; ++i) { sum += i; if (sum > 50) exit(10); else print "Sum =", sum } }'
运行以上 awk 命令,输出结果如下
Sum = 0 Sum = 1 Sum = 3 Sum = 6 Sum = 10 Sum = 15 Sum = 21 Sum = 28 Sum = 36 Sum = 45
在命令行/终端模式下,我们要如何检查程序的退出状态码呢?
哈哈,别急,可以使用 $?
范例 2
Shell 终端要检测上一个脚本的退出状态吗,可以直接使用 echo $?
命令
[www.twle.cn]$ echo $?
运行以上 awk 命令,输出结果如下
10