AWK をバイパスして AWK スクリプトにオプションを渡す

AWK をバイパスして AWK スクリプトにオプションを渡す

AWK オプションである引数を純粋な AWK スクリプトに直接渡すことはできますか?

スクリプトの例:

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

whoop を印刷したいのです./myscript -hが、AWK は最初に -h を取得し、代わりにその使用方法を印刷します。

実行は./myscript -- -h動作しますが、-f のせいで、シェバン内の -- が動作しません。

代わりに AWK を使用したシェル スクリプトを使用できることはわかっています。

答え1

チャレンジのために、FreeBSDで実行することもできますenvまたはGNU環境>= 8.30 (OP によって既に想定されています) の場合:

#! /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これをサポートしていると主張していますが、 では動作しません#!

関連情報