2012-03-23 54 views
0

我有一個函數「checkExist」,它接受一個命令並根據輸出文件是否已經存在執行它。我通過這樣的命令,其中文件1和文件2是命令創建的輸出文件的只是名字,因此,如果他們已經存在,會詢問你是否要覆蓋,否則將跳過:帶單引號的Eval 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被輸入到腳本「smartfilter.sh」含有內的功能checkExist。所以他們只是文件輸入。

在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的單引號',而不是正確解析它們。我試過\',但那也行不通。有沒有適當的方法來做到這一點?

回答

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

這工作!你介意解釋一下邏輯嗎? – 2012-03-23 21:31:08

+0

shell在雙引號字符串中進行變量替換,因此它將替換「$ 3」和「$ 4」替換爲空(因爲這些變量未設置)。您的單引號包含在雙引號內,因此被shell忽略(但不被awk)。我只是用'\'引用美元,所以shell不認爲它們是變量。殼雖然剝奪了'''引號,所以awk做正確的事情。 (如果你想讓shell和awk引用它,你必須說'\\\'')。我能說什麼?引用級別是黑魔法。 – ams 2012-03-23 21:37:31

+0

你是我的朋友的巫師 – 2012-03-23 21:47:44