Bash 带单引号的Eval awk命令

Bash 带单引号的Eval awk命令,bash,Bash,我有一个函数“checkExist”,它接收命令并根据输出文件是否已经存在来执行它。我传递这样一个命令,其中file1和file2只是命令创建的输出文件的名称,因此如果它们已经存在,它将询问您是否要覆盖,否则它将跳过: checkExist file1 file2 command1 command2 在实际使用中,如下所示: checkExist 1.txt 2.txt "echo $1 | awk '$5 <= 10 {print $3, $4}'" "echo $2 | awk '$

我有一个函数“checkExist”,它接收命令并根据输出文件是否已经存在来执行它。我传递这样一个命令,其中file1和file2只是命令创建的输出文件的名称,因此如果它们已经存在,它将询问您是否要覆盖,否则它将跳过:

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}'"
我得到一个这样的错误:

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周围的单个引号
没有正确解析它们。我试过
\'
,但也没用。有正确的方法吗?

checkExist 1.txt 2.txt“echo$1 | awk'\$5 shell在双引号字符串中进行变量替换,因此它将替换
$3
$4
而不替换任何内容(因为这些变量未设置)。您的单引号包含在双引号中,因此被shell忽略(但不被awk忽略)。我只是用
`引用了美元,因此shell不认为它们是变量。shell确实去掉了
`引号,因此awk做了正确的事。(如果你想让shell和awk都引用它,你必须说
\\\'
)我能说什么?引用级别是一种黑魔法。
checkExist 1.txt 2.txt "echo $1 | awk '\$5 <= 10 {print \$3, \$4}'" "echo $2 | awk '\$5 <= 10 {print \$3, \$4}'"
checkExist 1.txt 2.txt "echo $1 | awk '\$5 <= 10 {print \$3, \$4}'" "echo $2 | awk '\$5 <= 10 {print \$3, \$4}'"