Übergeben Sie Optionen an das AWK-Skript und umgehen Sie dabei AWK

Übergeben Sie Optionen an das AWK-Skript und umgehen Sie dabei AWK

Kann ich Argumente, die zufällig AWK-Optionen sind, direkt an ein reines AWK-Skript übergeben werden?

Beispielskript:

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

Ich möchte ./myscript -h„whoop“ drucken. Aber AWK holt zuerst das „-h“ ab und druckt stattdessen dessen Verwendung.

Das Ausführen ./myscript -- -hfunktioniert, aber ich kann -- im Shebang wegen des -f nicht zum Laufen bringen.

Ich weiß, dass ich stattdessen ein Shell-Skript mit AWK verwenden könnte.

Antwort1

Der Herausforderung halber könnte es mit dem FreeBSD durchgeführt werdenenvoder mit GNUUmgebung>= 8.30 (vom OP bereits angenommen) in einem Shebang:

#! /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

Das bedeutet jedoch nicht, dass es eine gute Idee ist.

Sie könnten stattdessen Folgendes versuchen:

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

Dies setzt voraus, dass Sie keinen Befehl BEGINin Ihrem haben PATH.

Antwort2

Wenn Sie GNU haben, awkkönnen Sie dies verwenden

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

Beispiele für die Verwendung

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

Ich habe es nicht getestet, aber die mawkVariante scheint -W execanstelle von zu verwenden --exec. GNU gawkbehauptet, dies ebenfalls zu unterstützen, aber es funktioniert nicht mit #!.

verwandte Informationen