Bash 带单引号的Eval awk命令
我有一个函数“checkExist”,它接收命令并根据输出文件是否已经存在来执行它。我传递这样一个命令,其中file1和file2只是命令创建的输出文件的名称,因此如果它们已经存在,它将询问您是否要覆盖,否则它将跳过: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 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}'"