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
    }
  • 相关阅读:
    OSG-提示“error reading file e:1.jpg file not handled”
    OSG-加载地球文件报0x00000005错误,提示error reading file simple.earth file not handled
    QT-找开工程后,最上方提示the code model could not parse an included file, which might lead to incorrect code completion and highlighting, for example.
    我的书《Unity3D动作游戏开发实战》出版了
    java中无符号类型的第三方库jOOU
    Windows批处理备份mysql数据
    使用 DevTools 时,通用Mapper经常会出现 class x.x.A cannot be cast to x.x.A
    Java版本,Java版本MongoDB驱动,驱动与MongoDB数据库,Spring之间的兼容性
    Jrebel本地激活方法
    wget下载指定网站目录下的所有内容
  • 原文地址:https://www.cnblogs.com/liujunjun/p/12397831.html
Copyright © 2011-2022 走看看