我在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/awkSolaris 的,那么就不能这样做,因为那些没有ARGV也不能引用它们的参数(除了 with FILENAMEwhen processing它们的参数作为输入文件)。在 Solaris 上,您可能希望使用它/usr/xpg4/bin/awk来获得接近标准的awk. 您的错误消息的措辞表明您正在使用它,mawk尽管这通常不是人们所说的传统版本,awk并且确实支持该语法。
现在,请注意,这system()实际上会调用sh来解释该cat fileshell 命令行¹,因此您不妨在sh其中完成整个操作(这将比csh本世纪真正不应使用的要好得多):
#! /bin/sh -
if [ "$1" = x ]; then
cat file
fi
Run Code Online (Sandbox Code Playgroud)
¹,此外,一些以 开头的参数-会被awk! 使用 GNU awk,您可以使用#! /usr/bin/gawk -Eshe-bang 来解决这个问题。