精通awk系列(18):awk流程控制:if、while、switch、for

回到:


流程控制语句

注:awk中语句块没有作用域,都是全局变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (condition) statement [ else statement ]
expr1?expr2:expr3
while (condition) statement
do statement while (condition)
for (expr1; expr2; expr3) statement
for (var in array) statement
break
continue
next
nextfile
exit [ expression ]
{ statements }
switch (expression) {
case value|regex : statement
...
[ default: statement ]
}

代码块

1
{statement}

if…else

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 单独的if
if(cond){
statements
}

# if...else
if(cond1){
statements1
} else {
statements2
}

# if...else if...else
if(cond1){
statements1
} else if(cond2){
statements2
} else if(cond3){
statements3
} else{
statements4
}

搞笑题:妻子告诉程序员老公,去买一斤包子,如果看见卖西瓜的,就买两个。结果是买了两个包子回来。

1
2
3
4
5
6
7
8
9
10
11
12
# 自然语言的语义
买一斤包子
if(有西瓜){
买两个西瓜
}

# 程序员理解的语义
if(没有西瓜){
买一斤包子
}else{
买两个包子
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
awk '
BEGIN{
mark = 999
if (mark >=0 && mark < 60) {
print "学渣"
} else if (mark >= 60 && mark < 90) {
print "还不错"
} else if (mark >= 90 && mark <= 100) {
print "学霸"
} else {
print "错误分数"
}
}
'

三目运算符?:

1
2
3
4
5
6
7
expr1 ? expr2 : expr3

if(expr1){
expr2
} else {
expr3
}
1
2
awk 'BEGIN{a=50;b=(a>60) ? "及格" : "不及格";print(b)}'
awk 'BEGIN{a=50; a>60 ? b="及格" : b="不及格";print(b)}'

switch…case

1
2
3
4
5
6
7
switch (expression) {
case value1|regex1 : statements1
case value2|regex2 : statements2
case value3|regex3 : statements3
...
[ default: statement ]
}

awk 中的switch分支语句功能较弱,只能进行等值比较或正则匹配。

各分支结尾需使用break来终止。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
switch($1){
case 1:
print("Monday")
break
case 2:
print("Tuesday")
break
case 3:
print("Wednesday")
break
case 4:
print("Thursday")
break
case 5:
print("Friday")
break
case 6:
print("Saturday")
break
case 7:
print("Sunday")
break
default:
print("What day?")
break
}
}

分支穿透:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
switch($1){
case 1:
case 2:
case 3:
case 4:
case 5:
print("Weekday")
break
case 6:
case 7:
print("Weekend")
break
default:
print("What day?")
break
}
}

while和do…while

1
2
3
4
5
6
7
while(condition){
statements
}

do {
statements
} while(condition)

while先判断条件再决定是否执行statements,do…while先执行statements再判断条件决定下次是否再执行statements。

1
2
awk 'BEGIN{i=0;while(i<5){print i;i++}}'
awk 'BEGIN{i=0;do {print i;i++} while(i<5)}'

多数时候,while和do…while是等价的,但如果第一次条件判断失败,则do…while和while不同。

1
2
awk 'BEGIN{i=0;while(i == 2){print i;i++}}'
awk 'BEGIN{i=0;do {print i;i++} while(i ==2 )}'

所以,while可能一次也不会执行,do…while至少会执行一次。

一般用while,do…while相比while来说,用的频率非常低。

for循环

1
2
3
4
5
6
7
for (expr1; expr2; expr3) {
statement
}

for (idx in array) {
statement
}
文章作者: 骏马金龙
文章链接: http://www.junmajinlong.com/shell/awk/awk_process_control_statement1/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 骏马金龙
打赏我