Bash 在awk脚本头中指定其他标志

Bash 在awk脚本头中指定其他标志,bash,awk,Bash,Awk,我想用#编写一个awk脚本文件/bin/awk-f标题,但我希望此脚本始终使用:作为字段分隔符。但是出于某种原因,写#/bin.awk-F:-F给了我一个语法错误。我还希望该脚本始终在同一个文件上运行,因此我也希望对其进行硬编码。基本上,我想做的是: #!/bin/awk -F: -f -- /etc/passwd 后面跟着一些awk代码,类似这样的代码应该可以: #!/bin/awk -f # using the #!/bin/awk -f BEGIN {

我想用
#编写一个awk脚本文件/bin/awk-f
标题,但我希望此脚本始终使用
作为字段分隔符。但是出于某种原因,写
#/bin.awk-F:-F
给了我一个语法错误。我还希望该脚本始终在同一个文件上运行,因此我也希望对其进行硬编码。基本上,我想做的是:

#!/bin/awk -F: -f -- /etc/passwd

后面跟着一些awk代码,类似这样的代码应该可以:

#!/bin/awk -f              # using the #!/bin/awk -f
BEGIN {
    FS=":"                 # always use : as a field separator
    ARGC=2
    ARGV[1]="/etc/passwd"  # always run on the same file
}
$3==0 {                    # followed by some awk code
    print $1
}
运行它:

$ chmod u+x program.awk
$ ./program.awk
root

这样做应该可以:

#!/bin/awk -f              # using the #!/bin/awk -f
BEGIN {
    FS=":"                 # always use : as a field separator
    ARGC=2
    ARGV[1]="/etc/passwd"  # always run on the same file
}
$3==0 {                    # followed by some awk code
    print $1
}
运行它:

$ chmod u+x program.awk
$ ./program.awk
root

永远不要使用shebang调用awk,因为这样做与在shell脚本中调用awk相比没有什么好处,但是会剥夺您将传递给shell脚本的参数分离为shell要处理的值的能力,awk要处理的值使用
-v
,使用脚本末尾的分配处理awk的值和运行awk的文件名

只要写下:

#!/usr/bin/env bash
awk -F':' '
whatever
' /etc/passwd
因此,如果有必要,您可以对其进行细微的调整:

#!/usr/bin/env bash
sort "$1" |
awk -F':' -v foo="$2" '
whatever
' - FS="$3" "$4"

或者您需要做的任何事情,以最恰当地使用传递给shell脚本的参数。

切勿使用shebang调用awk,因为这样做与在shell脚本中简单地调用awk相比没有什么好处,但会剥夺您将传递给shell脚本的参数分离为shell要处理的值的能力,要处理的awk的值使用
-v
,要处理的awk的值使用脚本末尾的赋值,以及要运行awk的文件名

只要写下:

#!/usr/bin/env bash
awk -F':' '
whatever
' /etc/passwd
因此,如果有必要,您可以对其进行细微的调整:

#!/usr/bin/env bash
sort "$1" |
awk -F':' -v foo="$2" '
whatever
' - FS="$3" "$4"

或者您需要执行的任何操作,以最恰当地使用传递给shell脚本的参数。

问题似乎在于不同的Linux/Unix系统没有一致地传递shebang参数。这篇文章提出了一些可以跨不同系统工作的解决方法:问题似乎在于不同的Linux/Unix系统没有一致地传递shebang参数。这篇文章有一些建议的变通方法,可以在不同的系统中使用: