Если вы префикс вашего сценария 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
.