我知道, awk
数组的下标必须是一个string。
[root@localhost]# awk 'END {array[A0]="empty"; print array[""]}' empty
所以在上面的命令行中,因为A0
不被引用为"A0"
,所以它代表一个variables。 因为variablesA0
之前没有设置过,所以值是""
。 所以print array[""]
输出为empty
。
但是在下面的命令中:
[root@localhost]# awk 'END {array[0]="empty"; print array[""], array["0"]}' empty
array[""]
值为NULL
而array["0"]
为"empty"
。 根据我的理解,这是因为variables不能以数字开头,默认情况下, array[0]
被转换为array["0"]
。 这样对吗? 转换awk
数组下标的规则是什么?
awk中的数组下标是字符串,所以当你使用表达式作为数组下标时,它将被转换成一个字符串(如果它不是已经存在的话)。 0
是一个数字,而不是一个变量,所以以下适用(来自POSIX ):
一个完全等于整数值的数字值(见ISO C标准派生的概念)应该被等同于对sprintf函数的调用(参见字符串函数)的字符串
"%d"
作为fmt参数和数值被转换为第一个也是唯一的expr参数。 任何其他数字值应该被转换为一个字符串,相当于对变量CONVFMT的值作为fmt参数和数值被转换为第一个和唯一的expr参数sprintf函数的调用。 如果CONVFMT的值不是浮点格式规范,则转换的结果是未指定的。
0
是一个整数,所以在转换为字符串时不给"0"
""
。 这是因为在C代码中,在sprintf(buf, "%d", 0)
, buf
将包含字符串"0"
。
至于变量名:在awk语法中 ,变量由标记NAME描述。 其辞典规定如下:
9)便携式字符集(参见IEEE Std 1003.1-2001第6.1节“便携式字符集”的基本定义卷)的下划线,数字和字母顺序应以下划线或字母开头,应被视为一个字。
12)标记NAME应由一个不是关键字或内建函数名称的单词组成,并且不能通过'('字符立即(没有任何分隔符)。
遵循这个描述的标记是变量,最初是空的,当一个空变量被转换为字符串时,它将产生空字符串。
以机智:
0
是一个数字 a
是一个变量名称 _
是一个变量名称 a0
是一个变量名称 _0
是一个变量名称 0a
被解析为0 a
( 0
和变量a
的连接)