考虑以下 awk 语句,该语句对文件中第 1 列的值求和
cat $1 e | awk ' {total=total+$1} # this comment does not contain any single quote marks
END {printf("%.2f\n",total)}
'
它按预期工作。
现在让我们保留相同的语句,但将注释更改为在内部添加单引号
cat $1 e | awk ' {total=total+$1} # don't do this
END {printf("%.2f\n",total)}
'
当我在 Mac Os 或 Centos 中运行此程序时,出现以下错误
./bad_sum: line 2: syntax error near unexpected token `
./bad_sum: line 2: ` END {printf("%.2f\n",total)}'
看起来 awk 试图将 don't 中的引号与 awk 后面的引号进行匹配,因此会感到困惑。但既然评论应该被忽略,这该如何解释呢?
答案1
这与awk无关。在大多数 shell(被认为类似于 Bourne 或 csh 的 shell)中,您不能在单引号分隔的脚本或字符串中包含单引号。尝试echo 'foo'bar'
看看它会失败。现在尝试echo 'foo\'bar'
看看它是否也失败了。现在尝试echo "foo'bar"
看看echo 'foo'\''bar'
你是否能找出他们成功的原因(不,我是不是建议您将脚本用双引号括起来)。看https://mywiki.wooledge.org/Quotes了解更多信息。
答案2
这是因为您的 shell 正在解释引号,并且正在解释 shell 中而不是 awk 中的 awk 语句的其余部分。