我有一个shell脚本,它将一个awk程序构造为一个字符串,然后将该字符串传递给awk.这是因为我想在awk程序中使用shell变量的值.
我的代码看起来像这样:
awk_prog="'{if (\$4~/$shell_var/) print \$1,\$2}'"
echo $awk_prog
awk $awk_prog $FILENAME
Run Code Online (Sandbox Code Playgroud)
但是,当我将字符串传递给awk时,我总是得到错误:
'{if ($4~/regex/) print $1,$2}'
awk: '{if
awk: ^ invalid char ''' in expression
Run Code Online (Sandbox Code Playgroud)
该错误消息的含义是什么?我尝试了-F:开关,但没有帮助.我该如何解决这个问题?
谢谢.
这是由shell引用引起的.以下将有效:
awk_prog="{ if (\$4 ~ /$shell_var/) print \$1, \$2 }"
echo "$awk_prog"
awk "$awk_prog" $FILENAME
Run Code Online (Sandbox Code Playgroud)
当你从命令行运行时awk '{ print }' foo,shell解释并删除程序周围的引号,因此awk接收两个参数 - 第一个是程序文本,第二个是文件名foo.你的例子是发送awk程序文本'{if ...}',就awk而言,这是无效的语法.外部引号不应存在.
在上面给出的代码片段中,shell使用行中的引号awk_prog=将字符串的内容分组为单个值,然后将其分配给变量awk_prog.当它执行该awk "$awk_prog"...行时,你必须引用扩展,$awk_prog因此awk接收程序文本作为单个参数.