真正退出 Awk 脚本

真正退出 Awk 脚本

Perl 和 Rubyexit实际上已经退出:

$ perl -e 'BEGIN {print 1; exit}; END {print 2}'
1

$ ruby -e 'BEGIN {print 1; exit}; END {print 2}'
1

但对于 Awk 来说则不然:

$ awk 'BEGIN {print 1; exit}; END {print 2}'
1
2

我尝试用“help.awk”解决这个问题

function really_exit() {
  IM_SURE = 1
  exit
}
END {
  if (IM_SURE) {
    exit
  }
}

但这也产生了自己的问题。如果“prog.awk”只有开始块:

BEGIN {
  print "start"
}

然后运行它:

awk -f help.awk -f prog.awk

将导致它挂起等待输入。是否有更好的解决方案可以真正退出 Awk 脚本?

答案1

如果 awk 程序有“中间”或END块,则读取输入。我们可以通过提供空输入来解决这个问题:

$ cat prog.awk
1
END {
  print "fin"
}

$ awk -f prog.awk /dev/null
fin

如果我们希望这是默认值,我们可以向“help.awk”添加一个块:

BEGIN {
  if (ARGC == 1 && !system("[ -t 0 ]")) {
    ARGV[ARGC++] = "/dev/null"
  }
}

然而,这带来了一个重要的变化;除非添加破折号,否则 awk 不会从终端读取数据:

awk -f help.awk -f prog.awk -

或修改“prog.awk”:

getline < "-"

读取输入示例:

$ cat prog.awk
/4/ {
  really_exit()
}
1
END {
  print "fin"
}

$ seq 10 | awk -f help.awk -f prog.awk
1
2
3

不读取输入的示例:

$ cat prog.awk
BEGIN {
  print "start"
  really_exit()
}
END {
  print "fin"
}

$ awk -f help.awk -f prog.awk
start

相关内容