外壳变量在awk中被错误解释

外壳变量在awk中被错误解释,awk,gawk,Awk,Gawk,在下面的代码中,我试图将shell varibale传递给awk。但当我尝试将其作为.sh foo_条运行时,打印的输出是“foo未声明”,而当我将其作为.sh bar_条运行时,打印的输出是“foo已声明”。awk中有bug还是我做错了什么 我正在使用gawk-3.0.3 #!/bin/awk model=$1 awk ' { match("'$model'", /foo/) ismodel=substr("'$model'", RSTART, RLENGTH)

在下面的代码中,我试图将shell varibale传递给awk。但当我尝试将其作为.sh foo_条运行时,打印的输出是“foo未声明”,而当我将其作为.sh bar_条运行时,打印的输出是“foo已声明”。awk中有bug还是我做错了什么

我正在使用gawk-3.0.3

#!/bin/awk

model=$1

awk ' {

      match("'$model'", /foo/)
      ismodel=substr("'$model'", RSTART, RLENGTH)
      if (  ismodel != foo ) {
        print  " foo is not declared"
      } else {
        print  " foo is declared"
      }
     }
    ' dummy
虚拟文件是一个只有一个空行的文件


谢谢,

使用-v选项从shell传入变量

awk -v model="$1" '{
  match(model, /foo/)
   .....
}
' dummy

您应该使用AWK的变量传递,而不是复杂的引用:

awk -v awkvar=$shellvar 'BEGIN {print awkvar}'

您的脚本是作为shell脚本编写的,但您有一行AWK shebang。您可以将其更改为
#/bin/sh

这不是一个bug,而是代码中的一个错误。问题在于:

if (  ismodel != foo ) {
这里的
foo
应该是
“foo”
。现在,您正在与一个空变量进行比较。如果有匹配项,则为false;如果没有匹配项,则为true。所以问题不在于如何使用shell变量

但正如其他回答者所说,将参数传递给
awk
的首选方式是使用
-v
开关。当您决定将awk脚本放在一个单独的文件中并防止所有类型的引用问题时,这也会起作用


我也不确定您是否使用了虚拟文件。这只是一个例子吗?否则,您应该忽略该文件并将所有代码放入
开始{}
块。

在此处粘贴代码时出错(#!/bin/awk thing)。如果我使用-v选项传递变量,这个问题可能会得到解决。但问题仍然是为什么awk以相反的方式检查比较?如果-v是传递shell变量的唯一选项,那么awk应该始终打印“foo未声明”。对吗?谢谢schot!。正如你所说的,这里的假人就是一个例子。