微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有AWK语法检查器?

有没有AWK语法检查器?我对只有标记语法错误的最小检查器和沿着lint行的更广泛的检查器感兴趣.

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

解决方法

如果您使用BEGIN {exit(0)} END {exit(0)}为Awk脚本添加前缀,则可以保证您的所有代码都不会运行.在BEGIN和END期间退出可防止其他开始和退出块运行.如果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

更新: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") }'

在Awk中,在BEGIN期间退出将取消所有其他开始块,并将阻止匹配任何输入.在END期间退出是阻止所有其他事件块运行的唯一方法;这就是上面第三次调用显示没有执行print语句的原因. GNU Awk用户指南有一个关于exit statement的部分.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐