第 1 行:if 处或附近的语法错误

ner*_*erf 1 linux awk

我在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。
文件仅包含“测试”。

Sté*_*las 6

那不是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 来解决这个问题。