Ste*_*nny 5 scripting awk exit
Perl 和 Rubyexit
实际退出:
$ perl -e 'BEGIN {print 1; exit}; END {print 2}'
1
$ ruby -e 'BEGIN {print 1; exit}; END {print 2}'
1
Run Code Online (Sandbox Code Playgroud)
对 awk 来说不是这样:
$ awk 'BEGIN {print 1; exit}; END {print 2}'
1
2
Run Code Online (Sandbox Code Playgroud)
我试图用“help.awk”解决这个问题
$ perl -e 'BEGIN {print 1; exit}; END {print 2}'
1
$ ruby -e 'BEGIN {print 1; exit}; END {print 2}'
1
Run Code Online (Sandbox Code Playgroud)
但这会产生它自己的问题。如果“prog.awk”只有开始块:
$ awk 'BEGIN {print 1; exit}; END {print 2}'
1
2
Run Code Online (Sandbox Code Playgroud)
然后运行它:
awk -f help.awk -f prog.awk
Run Code Online (Sandbox Code Playgroud)
将导致它挂起等待输入。是否有更好的解决方案,用于真正退出 awk 脚本?
如果 awk 程序有“中间”或END
块,则读取输入。我们可以通过提供空输入来解决这个问题:
$ cat prog.awk
1
END {
print "fin"
}
$ awk -f prog.awk /dev/null
fin
Run Code Online (Sandbox Code Playgroud)
如果我们希望这是默认值,我们可以向“help.awk”添加一个块:
BEGIN {
if (ARGC == 1 && !system("[ -t 0 ]")) {
ARGV[ARGC++] = "/dev/null"
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这带来了一个重要的变化;除非添加破折号,否则 awk 不会从终端读取数据:
awk -f help.awk -f prog.awk -
Run Code Online (Sandbox Code Playgroud)
或修改“prog.awk”:
awk -f help.awk -f prog.awk -
Run Code Online (Sandbox Code Playgroud)
读取输入示例:
getline < "-"
Run Code Online (Sandbox Code Playgroud)
不读取输入的示例:
$ cat prog.awk
/4/ {
really_exit()
}
1
END {
print "fin"
}
$ seq 10 | awk -f help.awk -f prog.awk
1
2
3
Run Code Online (Sandbox Code Playgroud)