linux - 如何将 "-L"传递给 awk 脚本?

标签 linux bash shell awk

我正在尝试编写一个接受 -L 作为参数的 awk 脚本。

作为向您展示我想要什么的示例,这里有一个名为 awktest 的简单 awk 脚本:

#!/usr/bin/awk -f 
BEGIN 
{
   print ARGV[1]
}

如果我从 shell 运行它:

$./awktest -w

我得到的输出是:

-w

这是我所期望的。它似乎适用于我放入除了 -L 中的任何内容。

如果我运行:

$./awktest -L

我得到:

awk: option requires an argument --L

当我期望 ARGV[1] 只包含 -L 时。这里发生了什么?为什么它在这种特定情况下会失败,我怎样才能让它在 ARGV 中接受 -L?谢谢

最佳答案

将 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 语法,您需要另一层间接层来将脚本参数放在它们需要的位置。

关于linux - 如何将 "-L"传递给 awk 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53270876/

相关文章:

c++ - 使用ssh框架加载共享库

bash - 不会记住在 while 循环内修改的变量

c - 为什么当我在 fork() 之前使用 dup2() 时它不起作用?

php - 使用 Centos7 和 Apache 在 PHP 中执行的命令无法连接到网络?

bash - 在单引号字符串中的 bash 中转义单引号

linux - yum 在 aws linux 上安装 mongodb 失败 : no package available

linux - kestrel-dotnetapp.service : Failed at step EXEC spawning/usr/local/dotnet: Permission denied

Linux Bash 无限循环与 sleep

linux - 重命名批量目录但保留原始目录名称的一部分 linux

bash - 如何在每一行前添加一个用 awk 找到的模式实例