在下面的代码中,我试图将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是一个空行的文件。
谢谢,
答案 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