8

是否有任何 AWK 语法检查器?我对只标记语法错误的最小检查器和更广泛的检查器感兴趣。

它应该只是一个静态检查器,不依赖于运行脚本。

4

3 回答 3

10

如果您在 awk 脚本前加上BEGIN { exit(0) } END { exit(0) },则可以保证您的任何代码都不会运行。在运行期间退出BEGINEND阻止其他开始和退出块运行。如果 awk 返回 0,则您的脚本没问题;否则会出现语法错误。

如果您将代码片段放在单独的参数中,您将在错误消息中获得良好的行号。这个调用...

gawk --source 'BEGIN { exit(0) } END { exit(0) }' --file syntax-test.awk

给出如下错误消息:

gawk: syntax-test.awk:3:   x = f(
gawk: syntax-test.awk:3:         ^ unexpected newline or end of string

GNU awk--lint可以发现诸如全局变量和未定义函数之类的东西:

gawk: syntax-test.awk:5: warning: function `g': parameter `x' shadows global variable
gawk: warning: function `f' called but never defined

并且 GNU awk 的--posix选项可以发现一些兼容性问题:

gawk: syntax-test.awk:2: error: `delete array' is a gawk extension

更新:BEGINEND

尽管该END { exit(0) }块似乎是多余的,但请比较这三个调用之间的细微差别:

$ echo | awk '
  BEGIN { print("at begin") }
  /.*/ { print("found match") }
  END { print("at end") }'
at begin
found match
at end

$ echo | awk '
  BEGIN { exit(0) }
  BEGIN { print("at begin") }
  /.*/ { print("found match") }
  END { print("at end") }'
at end

$ echo | awk '
  BEGIN { exit(0) } END { exit(0) }
  BEGIN { print("at begin") }
  /.*/ { print("found match") }
  END { print("at end") }'

在 awk 中,退出 duringBEGIN将取消所有其他 begin 块,并将阻止匹配任何输入。期间退出END是阻止所有其他事件块运行的唯一方法;这就是为什么上面的第三次调用显示没有执行任何打印语句。GNU Awk 用户指南有一个关于exit声明的部分。

于 2011-08-27T03:11:05.850 回答
2

GNU awk 似乎有一个--lint选项

于 2011-08-23T18:13:02.180 回答
0

对于在第一个错误处停止的最小语法检查器,请尝试awk -f prog < /dev/null.

于 2011-08-23T18:17:38.870 回答