转换awk数组下标的规则是什么?

我知道, 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[""]值为NULLarray["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 a0和变量a的连接)