23、AWK 循环

循环 用于以重复方式执行一组动作。只要循环条件为真,循环执行就会继续。

AWK语言中也存在循环。

对标C 语言, AWK 中也有三大循环、三大循环流程改变语句。

三大循环分别是:

1、 for循环;
2、 while循环;
3、 dowhile循环;

三大循环状态变更语句分别是:

1、 break语句退出循环;
2、 continue终止当前迭代的执行,开始下一个迭代;
3、 exit()退出当前程序;

下面,我们就一步一个脚印,慢慢的来了解下这六大语句。

for 循环

for 循环还是那个 for 循环,简直一点变化都没有。

AWK中的 for 循环语法格式如下

for (initialization; condition; increment/decrement)
   action

不得不吐槽,还是有变化的,就是,少了 大括号 {}

我们来看看这个标准的 for 循环。

1、 for循环的小括号内总共包含三大块语句,和两个必选的分号;,三个语句都是可以省略的;
2、 第一个语句称之为:初始化语句只要执行一些初始化操作,比如初始化循环变量
3、 第二个语句称之为:循环判断语句也就是检查条件,确定是否有必要进行下一次循环
4、 第三个语句称之为:循环变量递增语句一般情况下用于递增循环变量;
5、 当循环判断语句返回true,也就是当前循环允许被执行,那么就会执行后面的action语句块;

整个for 循环,只要 循环判断语句 一直返回 true,那么它就一直循环下去,永不退出。

第二个,我们要讲诉的是小括号内三大语句的执行时机。

1、 初始化语句在整个循环开始前执行,而且只会执行一次;
2、 循环判断语句会在每次循环前执行,如果不满足条件则退出整个循环,如果满足条件则执行action;
3、 循环变量递增语句会在每次循环结束后执行,用于递增循环变量;

好了,for 循环语句差不多就这些知识了,下面我们使用一个范例来演示一下

范例

下面的范例使用 for 循环语句输出 1 2 3 4 5 5个数字

[www.ddkk.com]$ awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'

运行以上 awk 命令,输出结果如下

1
2
3
4
5

while 循环

很多时候,我都在想,这些破编程语言到底要做啥啊。已经有一个 for 循环,为啥还要其它的循环语句做啥啊。

while 循环就是我所说的那个不知道为啥还存在的循环。

我们先不说 while 循环。我们先来看看刚刚那个 for 循环。大家会不会觉得这个 for 循环有点复杂啊。

三大语句:初始化语句循环判断语句循环变量递增语句 中只有第二个语句看起来才是每次循环必须的。

1、 初始化语句既然是在整个循环开始前执行,那么我们直接放在循环开始前就好了;
2、 循环变量递增语句既然是在每次循环结束后执行,那直接放在action语句中就好了,反正结果都一样;

这样想想,其实也就 循环判断语句 判断语句有点用。既然这样,我们就重新造一个关键字 while 来实现刚刚我们说的。

也即是说,while 循环语句会一直执行,直到 循环判断语句 返回 false。

AWK中的 while 循环语法格式如下

while (condition)
   action

while 循环会在每次执行前检查循环条件 condition 的值是否为 true。只要为 true,就会执行 action ,那么循环就会一直下去

范例

既然学会了 while 循环,那么我们就用 while 循环改写上面的 for 语句吧。

[www.ddkk.com]$ 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.ddkk.com]$ 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.ddkk.com]$ 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.ddkk.com]$ 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.ddkk.com]$ 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.ddkk.com]$ echo $?

运行以上 awk 命令,输出结果如下

10