Есть ли в AWK средства проверки синтаксиса? - PullRequest
6 голосов
/ 23 августа 2011

Существуют ли средства проверки синтаксиса AWK?Я заинтересован как в минимальных контролерах, которые только отмечают синтаксические ошибки, так и в более широких контролерах вдоль строк lint.

Это должна быть только статическая проверка, не зависящая от запуска скрипта.

Ответы [ 3 ]

8 голосов
/ 27 августа 2011

Если вы префикс вашего сценария 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) } кажется избыточным, сравните тонкие различия между этими тремя вызовами:

$ 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 .

2 голосов
/ 23 августа 2011

В GNU awk есть опция - lint .

1 голос
/ 23 августа 2011

Для минимальной проверки синтаксиса, которая останавливается при первой ошибке, попробуйте awk -f prog < /dev/null.

...