将选项绕过 AWK 传递给 AWK 脚本

将选项绕过 AWK 传递给 AWK 脚本

我可以获得直接传递给纯 AWK 脚本的 AWK 选项参数吗?

示例脚本:

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

我想./myscript -h打印呼喊。但 AWK 首先获取 -h 并打印其用法。

运行./myscript -- -h有效,但由于 -f,我无法在 shebang 中工作。

我知道我可以使用带有 AWK 的 shell 脚本来代替。

答案1

为了迎接挑战,可以使用 FreeBSD 来完成env或使用 GNU环境>= 8.30(OP 已经假设)在 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

但这并不意味着这是一个好主意。

你可以试试这个:

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

这假设您BEGINPATH.

答案2

如果你有 GNUawk你可以使用这个

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

样品使用

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

我还没有测试过它,但该mawk变体似乎使用-W exec而不是--exec. GNUgawk声称也支持这一点,但它不适用于#!.

相关内容