AWK 構文チェッカーはありますか? 私は、構文エラーにフラグを立てるだけの最小限のチェッカーと、lint の行に沿ったより広範なチェッカーの両方に興味があります。
スクリプトの実行に依存せず、静的チェッカーのみである必要があります。
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
次のようなエラー メッセージが表示されます。
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) }
、これら 3 つの呼び出しの微妙な違いを比較してください。
$ 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
することが、他のすべてのイベント ブロックの実行を防ぐ唯一の方法です。そのため、上記の 3 番目の呼び出しでは、print ステートメントが実行されていないことが示されています。GNU Awk User's Guide には、exit
ステートメントに関するセクションがあります。
GNU awk には--lint
オプションがあるようです。