我知道,awk
数组的下标必须是一个字符串。
[root@localhost]# awk 'END {array[A0]="empty"; print array[""]}'
empty
因此,在上面的命令行中,由于A0
未引用为"A0"
,因此它代表变量。由于变量A0
之前未设置值,因此值为""
。因此print array[""]
输出empty
。
但是在以下命令中:
[root@localhost]# awk 'END {array[0]="empty"; print array[""], array["0"]}'
empty
array[""]
的值为NULL
,而array["0"]
为"empty"
。根据我的理解,因为变量不能以数字开头,所以array[0]
默认会转换为array["0"]
。这样对吗?转换awk
数组下标的规则是什么?
答案 0 :(得分:4)
awk中的数组下标是字符串,因此当您将表达式用作数组下标时,它将转换为字符串(如果它不是一个字符串)。 0
是一个数字,而不是变量,因此以下内容适用(来自POSIX):
一个完全等于整数值的数值(参见ISO C标准派生的概念)应转换为字符串,相当于调用 sprintf 函数(请参阅字符串函数),并将字符串
"%d"
作为 fmt 参数,并将数值转换为第一个且唯一的 expr 参数。任何其他数值都应转换为字符串,相当于调用 sprintf 函数,变量 CONVFMT 的值为 fmt 参数和数值被转换为第一个也是唯一的 expr 参数。如果 CONVFMT 的值不是浮点格式规范,则未指定转换结果。
0
是一个整数,因此在转换为字符串时会提供"0"
,而不是""
。这是因为在C代码中,在sprintf(buf, "%d", 0)
之后,buf
将包含字符串"0"
。
对于变量名称:在awk grammar中,变量由标记 NAME 描述。它的词典规范如下:
9)应考虑便携式字符集中的下划线,数字和字母序列(参见IEEE Std 1003.1-2001的基本定义卷,第6.1节,便携式字符集),以下划线或字母开头一句话。
12)令牌 NAME 应包含一个不是关键字或内置函数名称的单词,并且不会立即跟随(没有任何分隔符)。 ('字符。
遵循此描述的标记是变量,最初为空,当空变量转换为字符串时,它会产生空字符串。
即便:
0
是一个数字a
是变量名称_
是变量名称a0
是变量名称_0
是变量名称0a
被解析为0 a
(0
和变量a
的串联)