(15)awk流程控制之if、while、switch、for语句
流程控制语句
注:awk中语句块没有作用域,都是全局变量。
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 ] }
代码块
{statement}
if...else
# 单独的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 }
# 自然语言的语义 买一斤包子 if(有西瓜){ 买两个西瓜 } # 程序员理解的语义 if(没有西瓜){ 买一斤包子 }else{ 买两个包子 }
[root@docker-01 ~]# 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 "错误分数" > } > } > ' 错误分数
三目运算符?:
expr1 ? expr2 : expr3 if(expr1){ expr2 } else { expr3 }
[root@docker-01 ~]# awk 'BEGIN{a=50;b=(a>60) ? "及格" : "不及格";print(b)}' 不及格 [root@docker-01 ~]# awk 'BEGIN{a=50; a>60 ? b="及格" : b="不及格";print(b)}' 不及格
switch...case
switch (expression) { case value1|regex1 : statements1 case value2|regex2 : statements2 case value3|regex3 : statements3 ... [ default: statement ] }
awk 中的switch分支语句功能较弱,只能进行等值比较或正则匹配。
各分支结尾需使用break来终止。
{ 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 } }
分支穿透:
{ 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
while(condition){ statements } do { statements } while(condition)
while先判断条件再决定是否执行statements,do...while先执行statements再判断条件决定下次是否再执行statements。
[root@docker-01 ~]# awk 'BEGIN{i=0;while(i<5){print i;i++}}' 0 1 2 3 4
[root@docker-01 ~]# awk 'BEGIN{i=0;do {print i;i++} while(i<5)}' 0 1 2 3 4
多数时候,while和do...while是等价的,但如果第一次条件判断失败,则do...while和while不同
[root@docker-01 ~]# awk 'BEGIN{i=0;while(i == 2){print i;i++}}' [root@docker-01 ~]# awk 'BEGIN{i=0;do {print i;i++} while(i ==2 )}' 0
所以,while可能一次也不会执行,do...while至少会执行一次。
一般用while,do...while相比while来说,用的频率非常低。
for循环
for (expr1; expr2; expr3) { statement } for (idx in array) { statement }