Передать параметры скрипту AWK, минуя AWK

Передать параметры скрипту AWK, минуя AWK

Можно ли передать аргументы, являющиеся опциями AWK, непосредственно в чистый скрипт AWK?

Пример сценария:

#!/usr/bin/env -S awk -f
BEGIN { if (ARGV[1] == "-h") print "whoop" }

Я хочу ./myscript -hнапечатать whoop. Но AWK сначала получает -h и вместо этого печатает его использование.

Запуск ./myscript -- -hработает, но я не могу заставить его работать в шебанге из-за -f.

Я знаю, что вместо этого можно использовать скрипт оболочки с AWK.

решение1

Ради интереса это можно сделать с помощью FreeBSDenvили с GNUокружающая среда>= 8.30 (уже предполагается автором) в спешке:

#! /usr/bin/env -S sh -c 'exec awk -f "$0" -- "$@"'
BEGIN { for(i = 1; i < ARGC; i++) print ARGV[i] }
./myscript -h 1 2 3
-h
1
2
3

Хотя это не значит, что это хорошая идея.

Вместо этого вы можете попробовать это:

#! /bin/sh
BEGIN { 2>"/dev/null"
        exec awk -f "$0" "--" "$@"
}
BEGIN { for(i = 1; i < ARGC; i++) print ARGV[i] }

Это предполагает, что BEGINв вашем файле PATH.

решение2

Если у вас есть GNU, awkвы можете использовать это

#!/usr/bin/gawk --exec
BEGIN { print "==>",ARGV[1],"<==" }

Образец использования

./a -h
 ==> -h <==

Я не проверял, но, mawkпохоже, этот вариант использует -W execвместо --exec. GNU gawkутверждает, что поддерживает и это, но он не работает с #!.

Связанный контент