Mic*_*ber 6 awk syntax-checking
有没有AWK语法检查器?我对只有标记语法错误的最小检查器和沿着lint行的更广泛的检查器感兴趣.
它应该只是一个静态检查器,不依赖于运行脚本.
如果您使用Awk脚本作为前缀BEGIN { exit(0) } END { exit(0) },则可以保证不会运行任何代码.退出BEGIN并END阻止其他开始和退出块运行.如果Awk返回0,那么你的脚本很好; 否则出现语法错误.
如果将代码段放在单独的参数中,您将在错误消息中获得良好的行号.这个调用......
gawk --source 'BEGIN { exit(0) } END { exit(0) }' --file syntax-test.awk
Run Code Online (Sandbox Code Playgroud)
给出如下错误消息:
gawk: syntax-test.awk:3: x = f(
gawk: syntax-test.awk:3: ^ unexpected newline or end of string
Run Code Online (Sandbox Code Playgroud)
GNU Awk --lint可以发现全局变量和未定义函数之类的东西:
gawk: syntax-test.awk:5: warning: function `g': parameter `x' shadows global variable
gawk: warning: function `f' called but never defined
Run Code Online (Sandbox Code Playgroud)
GNU Awk的--posix选项可以发现一些兼容性问题:
gawk: syntax-test.awk:2: error: `delete array' is a gawk extension
Run Code Online (Sandbox Code Playgroud)
BEGIN和END尽管该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") }'
Run Code Online (Sandbox Code Playgroud)
在Awk中,退出BEGIN将取消所有其他开始块,并将阻止匹配任何输入.退出END是防止所有其他事件块运行的唯一方法; 这就是上面第三次调用显示没有执行print语句的原因.GNU Awk用户指南有一个关于该exit声明的部分.