2012-05-08 1 views
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; }" 

は私が

GNU bashのは、バージョン4.1.5(1)-release(i486の-pc-linux-gnuのよう)

を使用しています

awk: cmd. line:1: Unexpected token 

を与えます

オン

Linux 2.6.32-34-generic-pae#77-Ubuntu SMP Tue Sep 13 21:16:18 UTC 2011 i686 GNU/Linux

+2

"動作しません"を定義してください。 –

+0

両方のコードを試すことができます。あなたは2番目のものを見て、間違います。 – abc

+6

それはSOの仕組みではありません。うまく形成された質問には、あなたの目的の説明とあなたの期待に合わない結果が含まれます。人々はあなたのコードを試してみるかもしれませんが、あなたの質問を完全に説明するのはあなた次第です。 –

答えて

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 

をさらにあなたはそれが

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

を失敗した理由がはっきりわかりますechoawkを交換する場合は、結果のコマンドに余分な '\'(バックスラッシュ)があります。これは、バッククォートを削除したためです。 解決策は、\ 'のペアを削除することです。

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

素晴らしい仕事と素晴らしいチップdtmilano!どうもありがとう。 – abc

10

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

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

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

+0

デニスに感謝します。あなたは正しいですし、私はawk -vを知っています。しかし、私はなぜ2回目の試みが実際に失敗したのか理解したかった。 – abc

+0

@ abc:複雑なクォートとエスケープを得ることは、バックティックを正しく使うことは難しい命題です。それを最初の場所で正しく行うことは、そのすべての不快感を避けます。あなたの最初の例を実行すると、エラーは出ませんが、変数をエコーする出力はありません。 –

+0

デニス、私が使用しているbashバージョンとLinuxバージョンを追加しました。それは私のためにうまく動作します。どのバージョンを使用していますか? – abc

関連する問題