【发布时间】:2017-08-31 06:19:03
【问题描述】:
我正在尝试编写一个不使用任何文件输入参数或任何东西的简单 awk 脚本。到目前为止,我只测试了它编写了一个 hello world 程序:
#!/usr/bin/awk
BEGIN{}
{print "hello"}
END{}
当我尝试通过终端运行它时出现错误awk: 1: unexpected character '.':./program.awk
为什么会这样?
谢谢
【问题讨论】:
我正在尝试编写一个不使用任何文件输入参数或任何东西的简单 awk 脚本。到目前为止,我只测试了它编写了一个 hello world 程序:
#!/usr/bin/awk
BEGIN{}
{print "hello"}
END{}
当我尝试通过终端运行它时出现错误awk: 1: unexpected character '.':./program.awk
为什么会这样?
谢谢
【问题讨论】:
像这样将-f添加到shebang行的末尾以告诉awk脚本如下:
#!/usr/bin/awk -f
另外,由于您没有输入,请将print 放入BEGINblock:
BEGIN {print "Hi"}
【讨论】:
./program.awk 脚本和 BEGIN {} 块用于做不需要输入文件的事情?那么主块{...}使用输入文件进行操作?
./program.awk 时,会创建一个新进程并在该进程中执行 awk 并且 -f 告诉 awk 脚本在此文件中。 BEGIN{} 中的内容在读取任何输入之前执行,这非常适合您的用例,无需任何输入数据。后续{...} 中的内容会为后续的每一行输入执行,但您没有输入,因此它可能会挂起等待。
END{...} 块是否也会挂起,即使我没有在脚本中创建主块?
awk 的风格不同,我也不会感到惊讶。请注意,您始终可以将/dev/null 用作空 输入文件,将yes 用作无限输入文件。
END 块永远不会挂起。在旧的、损坏的 awk 中,没有输入且没有明确的 exit 语句的 BEGIN 块会挂起,但情况不同。我的建议 - 永远不要通过 shebang 调用 awk,因为它会剥夺您将 shell 命令参数分离为 awk 参数和变量和/或围绕 awk 脚本执行 shell 功能(getopts?)的能力。只需从 shell 脚本中显式调用 awk。