为什么 $var 的值为 $0?

为什么 $var 的值为 $0?

我编写了一个非常简单的 awk 脚本,可以反转文件中的每个单词:

awk '
{
for (i=1;i<=NF;i++)
{ x=""
for(j=length($i);j>0;j--)
x=x substr($0,j,1);
print x
}}' file1

file1的内容如下:

hello

现在令我困惑的是,当我替换 - 时:

print x

print $x

我得到记录的输出,即。我明白了你好不是相反的输出奥莱

为什么使用 $x 会给我 $0 的内容?变量在 awk 中如何工作?这真的很令人困惑。当我应该使用 $x 以及何时只使用 x 时,是否有一个设定的规则?

答案1

x是你的 awk 变量,$x是不同的东西......

$0对应于刚刚读取的行的输入字符串内容,而$1...对应于使用默认分隔符的内容$n的细分字段。$0

awk 允许您使用变量以编程方式访问字段,即,如果变量MyValue包含5,$MyValue则与 相同$5

这里发生的情况是您的变量x确实包含olleh字符串,该字符串在数字上被解释为0。在 awk 中,所有以非数字值开头的字符串在用作数值时都被解释为0,例如,5*"test"计算结果为 ,0因为"test"解释为0)。因此,在您的情况下,$x与 相同$0,它是提供的输入字符串,即hello

答案2

首先你应该知道什么是有效变量awk。 POSIX 定义awk 变量作为:

以可移植字符集中的 或 字母字符开头<underscore>(请参阅 XBD 可移植字符集中的表),后跟可移植字符集中的一系列下划线、数字和字母,最后是“=”字符,应指定变量赋值而不是路径名

因此,当您有一个awk变量x,并且想要使用时x,只需引用它,直接编写xexampleprint xy = x

当您使用时$x,您正在访问awk 字段变量。在 中,通过 后跟数字或数值表达式来awk访问字段变量。$所以你写的时候$xawk会先评价x。如果 x 具有数值,例如1,则语句变为$1awk将为您提供第一个字段变量的值。或者你有一个像 之类的数值表达式(1+1),然后$(1+1)变成$2,你将得到第二个字段变量的值。

请注意,当字段编号表达式计算为除非负整数,行为未指定(如x = "qwerty"x = "qwerty"+1,则访问$x未指定):

未指定字段编号表达式计算为非负整数以外的任何值的效果;在此上下文中,未初始化的变量或字符串值不需要转换为数值

在您的情况下,您的awk实现将字段编号表达式(它是一个字符串)评估为,因此您获得了变量0的值。$0在其他awk实现中,结果可能不同(至少在 OpenBSD 中awk,你会得到一个错误illegal field)。

相关内容