假设我有两段代码:
awk ' BEGIN {for (i=0; i<ARGC-1; i++) {printf "ARGV[%d] = %s\n", i, ARGV[i]}} {print "So as you can see, complications can occur."} ' one two three four
除非目录中有一个名为one
的文件,否则此部分将无效。
awk ' BEGIN {for (i=0; i<ARGC-1; i++) {printf "ARGV[%d] = %s\n", i, ARGV[i]}}' one two three four
这将正常工作,one two three four
将被理解为参数。那为什么前者不起作用呢?是什么让awk认为某些东西来自文件而某些东西是争论?谢谢。
答案 0 :(得分:4)
运行任何BEGIN
块后,如果有剩余代码,则每行输入一次运行 - 这意味着awk
必须读取其输入。如果ARGV
在awk
读取输入时有任何内容,则会将其解释为要打开和读取的文件列表;否则,将读取标准输入。
在您的示例中,提及并发症的print
行不在BEGIN
块内,因此在awk
读取输入行之前不会运行 - 它会尝试从文件one
开始,因为它是第一个参数。
如果你想将参数传递给AWK程序而不将它们视为文件名,你可以;如果您还有ARGV
块之外的任何代码,请务必不要将它们留在BEGIN
中:
awk 'BEGIN {
for (i=0; i<ARGC-1; i++) {printf "ARGV[%d] = %s\n", i, ARGV[i]};
delete ARGV}
{print "So as you can see, complications can occur."}' one two three four
以上将打印出消息,然后在标准输入上等待一行。收到任何行后,它会打印出有关并发症的信息。
如果你只是想让一个AWK程序在没有尝试读取和处理任何输入的情况下完成它的工作 - 除了那个AWK可能是一个奇怪的选择 - 只需将所有代码放在一个或多个BEGIN
中块。如果awk
完成BEGIN
块并且找不到其他代码,则它将退出而不尝试读取任何输入。
答案 1 :(得分:2)
awk
需要有效的输入数据(来自文件或stdin)来执行BEGIN
块之外的代码。在第一个代码段中,您在print
之外有一个BEGIN
语句,如果awk
有一些有效输入(即使为空),将会执行该语句。但是,如果您的输入文件不存在,那么awk将返回此错误:
fatal: cannot open file `one' for reading (No such file or directory)
第二个代码段没有有效输入,因为您只有BEGIN
块内的代码。