我正在尝试编写一个接受-L
作为参数的awk脚本。
作为显示我想要的示例,下面是一个名为awktest
的简单awk脚本:
#!/usr/bin/awk -f
BEGIN
{
print ARGV[1]
}
如果我是从shell运行的:
$./awktest -w
我得到输出:
-w
这是我的期望。
如果我跑步:
-L
我得到:
$./awktest -L
当我期望ARGV [1]仅包含awk: option requires an argument --L
时。这里发生了什么?为什么在此特定情况下失败,如何使它在ARGV中接受-L
?谢谢
答案 0 :(得分:4)
将awk脚本包装在shell脚本中:
#!/bin/sh
awk 'BEGIN {
print ARGV[1]
}' "$@"
示例:
$ ./awktest -L
-L
问题是,当使用shebang行运行脚本时,指定的程序将以脚本名称和脚本参数作为额外的命令行参数运行。换句话说,使用原始的awktest脚本,运行awktest -L
会变成/usr/bin/awk -f /path/to/awktest -L
,因此awk会将-L
视为其参数,而不是实际脚本的参数。
如果您不想使用./awktest -- -L
语法,则需要另一层间接方式将脚本参数放在需要的地方。