是否可以使用变量作为真正多维数组的索引?我有一个运行Cisco配置文件的gawk 4.1.1脚本,我想创建一个如下所示的数组:
myarray [sitecode] [switchname]
从正在处理的FILENAME中提取sitecode和switchname,然后在此基础上添加索引以计算每个交换机的各种内容。对于上面的两个索引,我想将索引和值都设置为相同的变量。最终,我可以得到这样一个数组:
myarray[nyc01][switch01][Vlan100][192.168.100.1]
myarray[nyc01][switch01][Vlan101][192.168.101.1]
myarray[nyc01][switch02][Vlan200][192.168.200.1]
下面的代码说明了我要做的事情:
#!/bin/bash
awk '{
var1="variable1"
var2="variable2"
array[var1]=var1
array[var1][var2]=var2
print array[var1][var2]
}'
我得到这个错误:
awk: cmd. line:6: (FILENAME=- FNR=1) fatal: attempt to use scalar `array["variable1"]' as an array
我有点理解为什么会这样。我声明var1和var2是标量变量。但是,对于我正在尝试做的事情,是否有一种解决方法?
当您设置array[var1] = var1
时,您将该元素设置为保存标量。
然后你尝试array[var1][var2] = var2
,你想要重新定义在array[var1]
中存储的东西。引用自手册
已赋值的元素的类型不能通过赋值不同类型的值来改变。您必须首先删除当前元素,这有效地使gawk忘记该索引处的元素:
(强调我的)
我看到如果你尝试按其他顺序赋值,你会得到一个不同但相应的错误消息
% awk 'BEGIN {v1="foo"; v2="bar";a[v1][v2] = v2; a[v1]=v1}'
awk: cmd. line:1: fatal: attempt to use array `a["foo"]' in a scalar context
你可以坚持使用模拟多维数组:
$ awk 'BEGIN {v1="foo"; v2="bar"; a[v1] = v1; a[v1,v2] = v2; print a[v1,v2]}'
bar