3

在下面的代码中,我试图将 shell 变量传递给 awk。但是当我尝试将它作为 a.sh foo_bar 运行时,打印的输出是“foo is not declared”,而当我作为 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 是带有单个空行的文件。

谢谢,

4

3 回答 3

2

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

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

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

于 2010-08-20T06:36:57.590 回答
1

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

if (  ismodel != foo ) {

这里foo应该是"foo"。现在您正在与一个空变量进行比较。当你有匹配时这会给出 false ,当你没有匹配时会给出 true 。所以问题不在于你使用 shell 变量的方式。

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

我也不确定您对虚拟文件的使用情况。这只是为了举例吗?否则,您应该省略该文件并将所有代码放入BEGIN {}块中。

于 2010-08-20T07:27:10.650 回答
0

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

awk -v model="$1" '{
  match(model, /foo/)
   .....
}
' dummy
于 2010-08-20T06:35:51.320 回答