为什么 awk 命令中注释内的单引号会导致引号变得不匹配?

为什么 awk 命令中注释内的单引号会导致引号变得不匹配?

考虑以下 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 语句的其余部分。

相关内容