Shell变量在awk中被错误地解释

时间:2010-08-20 06:33:08

标签: awk gawk

在下面的代码中,我试图将shell varibale传递给awk。但是当我尝试将其作为a.sh foo_bar运行时,打印的输出是“foo未声明”,当我将其作为a.sh bar_bar运行时,打印的输出为“foo is declared”。 awk中是否有错误或者我在这里做错了什么?

我正在使用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

dummy是一个空行的文件。

谢谢,

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

这不是错误,而是代码中的错误。有问题的一行是:

if (  ismodel != foo ) {

此处foo应为"foo"。现在你正在与一个空变量进行比较。当你有匹配时,这会给出错误,当你没有匹配时,这会给出真的。所以问题不在于你使用shell变量的方式。

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

我也不确定您是否使用了虚拟文件。这仅仅是为了这个例子吗?否则,您应该省略该文件并将所有代码放在BEGIN {}块中。

答案 2 :(得分:0)

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

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