我在treat.awk 中的代码是:
#!/usr/bin/awk -f
if($1 == "x") cat file
Run Code Online (Sandbox Code Playgroud)
我在命令提示符中的输入是:
~/home/treat.awk x
Run Code Online (Sandbox Code Playgroud)
出现如下错误信息:
line 1: syntax error at or near if
Run Code Online (Sandbox Code Playgroud)
如何解决?我在这段代码中使用了 awk,并且只允许使用传统版本的 awk。
文件仅包含“测试”。
那不是awk
代码,那是csh
代码。将she-bang更改为
#! /bin/csh -f
if($1 == "x") cat file
Run Code Online (Sandbox Code Playgroud)
(这-f
不是像 in 那样将文件作为参数awk
,而是不读取用户的~/.cshrc
)
awk
做同样事情的代码类似于:
#! /usr/bin/awk -f
BEGIN {
if (ARGV[1] == "x") exit(system("cat file"))
}
Run Code Online (Sandbox Code Playgroud)
如果awk的传统版本,您指的是 1985 年之前的非 POSIX 版本,例如/bin/awk
Solaris 的,那么就不能这样做,因为那些没有ARGV
也不能引用它们的参数(除了 with FILENAME
when processing它们的参数作为输入文件)。在 Solaris 上,您可能希望使用它/usr/xpg4/bin/awk
来获得接近标准的awk
. 您的错误消息的措辞表明您正在使用它,mawk
尽管这通常不是人们所说的传统版本,awk
并且确实支持该语法。
现在,请注意,这system()
实际上会调用sh
来解释该cat file
shell 命令行¹,因此您不妨在sh
其中完成整个操作(这将比csh
本世纪真正不应使用的要好得多):
#! /bin/sh -
if [ "$1" = x ]; then
cat file
fi
Run Code Online (Sandbox Code Playgroud)
¹,此外,一些以 开头的参数-
会被awk
! 使用 GNU awk
,您可以使用#! /usr/bin/gawk -E
she-bang 来解决这个问题。