用于输出其名称的可执行 awk 脚本



我有一个简单的可执行awk脚本,我试图说出它自己的名字:

$ cat script.awk
#!/usr/bin/awk -f
BEGIN {
print "Hi, I'm " ARGV[0]
}

执行时:

$ chmod u+x script.awk
$ ./script.awk
Hi, I'm awk

预期(好吧,无论如何都是需要的(输出将是Hi, I'm script.awk.除了将其转换为 shell 脚本之外,有没有办法实现这一目标,例如:

$ cat script.sh
#!/bin/bash
read -d '' script <<EOF
BEGIN {
print "Hi, I'm " var
}
EOF
awk -v var=$0 "$script"

AAAND,动作:

$ ./script.sh
Hi, I'm ./script.sh

在 bash 或 zsh 中,你可以通过ENVIRON["_"]使用 shell 环境变量$_

$ cat script.awk
#!/usr/bin/awk -f
BEGIN {
print "Hi, I'm " ENVIRON["_"]
}
$ chmod u+x script.awk
$ ./script.awk
Hi, I'm /tmp/./script.awk

ENVIRON数组是 POSIX 标准中定义的 awk 特殊变量,因此它应该在任何版本的 awk 中都很容易获得,但不同的 shell 实现$_不同,因此这只有在您从 bash 或 zsh 调用时才可靠

这在 dash 中不起作用(通常作为/bin/sh安装(,因为 dash 将上一个命令分配给$_(如果这是第一个命令,它将分配自己(。

Korn Shell(至少ksh93(将外壳的PID(用星号包围(作为值的前缀,就像*12345*./script.awk一样,因此需要稍作修改。

这个版本可以在bash,zsh和ksh中使用:

#!/usr/bin/awk -f
BEGIN {
self = ENVIRON["_"]
sub(/^*[0-9]+*/, "", self)
print "Hi, I'm " self
}

最新更新