zoukankan      html  css  js  c++  java
  • (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
    }
  • 相关阅读:
    Oracle并行操作——从串行到并行
    Log4Net使用指南
    NET开发人员应该要知道
    测试11g压缩性能
    C#不同操作系统下,界面大小不一的原因
    采用nettcp绑定的wcf宿主到iis7
    Packaging Oracle Data Access Components into .Net projects
    Operating System Property Values
    【转】《Effective C#中文版:改善C#程序的50种方法》读书笔记
    解决.svc 无法解析
  • 原文地址:https://www.cnblogs.com/liujunjun/p/12397831.html
Copyright © 2011-2022 走看看