2

なぜこれが機能するのですか:

これ

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) リリース (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

4

2 に答える 2

10

シェル変数を AWK プログラムに渡す正しい方法は、シェル変数を埋め込もうとする代わりに、AWK の変数渡し機能を使用することです。また、一重引用符を使用することで、不要なエスケープを何度も行う必要がなくなります。

echo "hello hi" | awk -v var="$var" '{ if ($1 == var ) print $2; }'

また、$()バッククォートの代わりに使用する必要があります。

于 2012-05-08T04:30:45.263 に答える
5

あなたの 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

さらに、次のように置き換えると、失敗する理由が明確awkechoわかります

echo hello hi | echo "{ if (\\\$1 == \"$var\" ) print \\\$2; }"
{ if (\$1 == "hello" ) print \$2; }

結果のコマンドには余分な '\' (バックスラッシュ) があります。これは、逆引用符を削除したためです。したがって、解決策は\のペアを削除することです

echo hello hi | awk "{ if (\$1 == \"$var\" ) print \$2; }"
hi
于 2012-05-08T04:47:23.267 に答える