【问题标题】:Simple awk scripts that takes no arguments or input file不带参数或输入文件的简单 awk 脚本
【发布时间】:2017-08-31 06:19:03
【问题描述】:

我正在尝试编写一个不使用任何文件输入参数或任何东西的简单 awk 脚本。到目前为止,我只测试了它编写了一个 hello world 程序:

#!/usr/bin/awk
BEGIN{}
{print "hello"}
END{}

当我尝试通过终端运行它时出现错误awk: 1: unexpected character '.'./program.awk 为什么会这样? 谢谢

【问题讨论】:

    标签: linux shell awk terminal


    【解决方案1】:

    像这样将-f添加到shebang行的末尾以告诉awk脚本如下:

    #!/usr/bin/awk -f
    

    另外,由于您没有输入,请将print 放入BEGINblock:

    BEGIN {print "Hi"}
    

    【讨论】:

    • 所以如果我理解正确 -f 标志告诉 awk 运行 ./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。
    猜你喜欢
    • 2020-08-28
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 2021-03-27
    • 2013-02-28
    • 1970-01-01
    相关资源
    最近更新 更多