假设我有两段代码:
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
Run Code Online (Sandbox Code Playgroud)
one除非目录中有一个被调用的文件,否则这篇文章将无法工作。
awk ' BEGIN {for (i=0; i<ARGC-1; i++) {printf "ARGV[%d] = %s\n", i, ARGV[i]}}' one two three four
Run Code Online (Sandbox Code Playgroud)
这将正常工作并将one two three four被理解为参数。那么为什么前者不起作用呢?是什么让 awk 认为某些内容来自文件而某些内容是参数?谢谢。
运行任何BEGIN块后,如果有任何剩余代码,则每行输入运行一次 - 这意味着awk必须读取其输入。ARGV如果when gos to read输入中有任何内容awk,它会被解释为要打开和读取的文件列表;否则,将读取标准输入。
在您的示例中,print提到复杂性的行不在块内,因此在读取一行输入BEGIN之前它不会运行- 它将尝试从文件中执行此操作,因为它是第一个参数。awkone
如果您想将参数传递给 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
Run Code Online (Sandbox Code Playgroud)
上面的代码将打印出消息,然后等待标准输入上的一行。收到任何行后,它将打印出有关并发症的消息。
如果您只是想让 AWK 程序完成其任务,而不尝试读取和处理任何输入(暂且不说 AWK 对于该场景来说可能是一个奇怪的选择),只需将所有代码放入一个或多个BEGIN块中即可。如果awk完成BEGIN块并且没有找到其他代码,它将退出而不尝试读取任何输入。
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |