2012-03-23 13 views
0

コマンドを受け取り、出力ファイルがすでに存在するかどうかに基づいて実行するcheckExistという関数があります。私は、コマンドを作成し、出力ファイルの名前だけFILE2あるfile1と、このようなコマンドを渡すので、彼らはすでにあなたが上書きしたい場合には、他に要求されますが存在するかどうかはスキップします:一重引用符で囲まれたawkコマンド

checkExist file1 file2 command1 command2 

checkExist 1.txt 2.txt "echo $1 | awk '$5 <= 10 {print $3, $4}'" "echo $2 | awk '$5 <= 10 {print $3, $4}'" 

上記の$ 1と$ 2は、関数checkExist withinを含むスクリプト "smartfilter.sh"への入力です。だから彼らは単なるファイル入力です。

その後checkExist機能でユーザーのタイプ「Y/Y」が上書きする場合、またはファイルが既に存在していないことが

eval $3 & 
eval $4 & 
wait 

意志と、私はそうのようなエラーが出る:

awk: >= 10 {print , } 
awk:^syntax error 
awk: >= 10 {print , } 
awk:    ^syntax error 
awk: >= 10 {print , } 
awk:    ^syntax error 
awk: cmd. line:1: >= 10 {print , } 
awk: cmd. line:1:    ^unexpected newline or end of string 

私は、awkとevalの前後で一重引用符を正しく解析していないことを知っています。私は\'を試しましたが、それはどちらもうまくいきません。これを行う適切な方法はありますか?

答えて

2
checkExist 1.txt 2.txt "echo $1 | awk '\$5 <= 10 {print \$3, \$4}'" "echo $2 | awk '\$5 <= 10 {print \$3, \$4}'" 
+0

これは機能しました。あなたはその論理を説明してもらえますか? –

+0

シェルは二重引用符の中で変数置換を行います。したがって、 '$ 3'と' $ 4'は何も置き換えられません(これらの変数は設定されていないため)。あなたの一重引用符は二重引用符の中に含まれているので、シェルによって無視されます(しかし、awkでは無視されます)。私はドルを '\'で引用したので、シェルは変数を変数と考えることはありません。シェルは '\'引用符を取り除くので、awkは正しいことを行います。 (シェルとawkの両方を引用したい場合は、 '\\\ ''と言う必要があります)。私は何を言うことができますか?引用レベルは黒の魔法です。 – ams

+0

あなたは魔術師の私の友人です –

関連する問題