將選項繞過 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聲稱也支持這一點,但它不適用於#!.

相關內容