баш. Лучший способ создать переключаемый массив (изменить ключи для значений)

#arrays #bash #key

#массивы #bash #Клавиша

Вопрос:

У меня есть массив:

 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
  

Что я делаю не так? Как я могу получить переключаемый массив? Спасибо.

Ответ №1:

Вы должны выполнять итерации по ключам, а не по значениям (как только вы получите значение, вы не сможете вернуться к ключам!).

Затем объявите и создайте словарь со значением в качестве ключа ifaces_and_macs и используя ключ в качестве значения ifaces_and_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
  

Конечно, это хорошо работает, только если значения уникальны (словарь должен быть биективным): если в ваших значениях есть дубликаты, вы получите только последнее.