Arrays 猛击。创建交换数组的最佳方法(更改值的键)

Arrays 猛击。创建交换数组的最佳方法(更改值的键),arrays,bash,key,Arrays,Bash,Key,我有一个数组: declare -gA ifaces_and_macs ifaces_and_macs["eth0"]="00:00:00:00:00:00" ifaces_and_macs["eth1"]="00:00:00:00:00:11" 所需阵列为: ifaces_and_macs_switched["00:00:00:00:00:00"]="eth0" ifaces_and_macs_switched["00:00:00:00:00:11"]="eth1" 我试过这样的方法: d

我有一个数组:

declare -gA ifaces_and_macs
ifaces_and_macs["eth0"]="00:00:00:00:00:00"
ifaces_and_macs["eth1"]="00:00:00:00:00:11"
所需阵列为:

ifaces_and_macs_switched["00:00:00:00:00:00"]="eth0"
ifaces_and_macs_switched["00:00:00:00:00:11"]="eth1"
我试过这样的方法:

declare -gA ifaces_and_macs_switched
for iface_mac in "${ifaces_and_macs[@]}"; do
    ifaces_and_macs_switched["$iface_mac"]=${!ifaces_and_macs["$iface_mac"]}
done

我做错了什么?如何获得交换阵列?谢谢。

您必须迭代键,而不是值(一旦获得值,就无法返回键!)

然后声明并构建一个字典,将值作为
ifaces\u和\u macs的键
,并将键作为
ifaces\u和\u macs的值

declare -gA ifaces_and_macs
declare -gA ifaces_and_macs_switched
ifaces_and_macs["eth0"]="00:00:00:00:00:00"
ifaces_and_macs["eth1"]="00:00:00:00:00:11"

for iface_mac in "${!ifaces_and_macs[@]}"; do
    ifaces_and_macs_switched[${ifaces_and_macs[$iface_mac]}]=$iface_mac 
done

echo ${ifaces_and_macs_switched["00:00:00:00:00:00"]}
echo ${ifaces_and_macs_switched["00:00:00:00:00:11"]}
结果

eth0
eth1

当然,只有在值是唯一的情况下(字典必须是双射的):如果值中有重复项,则只能得到最后一个。

您必须迭代键,而不是值(一旦获得值,就无法返回键!)

然后声明并构建一个字典,将值作为
ifaces\u和\u macs的键
,并将键作为
ifaces\u和\u macs的值

declare -gA ifaces_and_macs
declare -gA ifaces_and_macs_switched
ifaces_and_macs["eth0"]="00:00:00:00:00:00"
ifaces_and_macs["eth1"]="00:00:00:00:00:11"

for iface_mac in "${!ifaces_and_macs[@]}"; do
    ifaces_and_macs_switched[${ifaces_and_macs[$iface_mac]}]=$iface_mac 
done

echo ${ifaces_and_macs_switched["00:00:00:00:00:00"]}
echo ${ifaces_and_macs_switched["00:00:00:00:00:11"]}
结果

eth0
eth1
当然,只有当值是唯一的(dictionary必须是双射的)时,这才有效:如果值中有重复项,则只会得到最后一个