为什么这个工作:
这个
var=hello myvar=`echo hello hi | awk "{ if (\\\$1 == \"$var\" ) print \\\$2; }"` echo $myvar
给
hi
但是这不?
这个
var=hello echo hello hi | awk "{ if (\\\$1 == \"$var\" ) print \\\$2; }"
给
awk: cmd. line:1: Unexpected token
我在用
GNU bash,版本4.1.5(1)-release(i486-pc-linux-gnu)
上
Linux 2.6.32-34-generic-pae#77 -Ubuntu SMP Tue Sep 13 21:16:18 UTC 2011 i686 GNU / Linux
如果你的awk和我的一样,它会告诉你它失败的地方:
var=hello echo hello hi | awk "{ if (\\\$1 == \"$var\" ) print \\\$2; }" awk: syntax error at source line 1 context is { if >>> (\ <<< $1 == "hello" ) print \$2; } awk: illegal statement at source line 1
而且,如果你用awk
替换awk
,你会清楚地看到它为什么会失败
echo hello hi | echo "{ if (\\\$1 == \"$var\" ) print \\\$2; }" { if (\$1 == "hello" ) print \$2; }
在结果的命令中有额外的'\'(反斜杠)。 这是因为你删除了反引号。 所以解决办法是删除一对
echo hello hi | awk "{ if (\$1 == \"$var\" ) print \$2; }" hi
将shell变量传递到AWK程序的正确方法是使用AWK的变量传递功能,而不是试图嵌入shell变量。 通过使用单引号,你将不必做一堆不必要的转义。
echo "hello hi" | awk -v var="$var" '{ if ($1 == var ) print $2; }'
此外,你应该使用$()
而不是反引号。