2012-03-23 148 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