#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
Конечно, это хорошо работает, только если значения уникальны (словарь должен быть биективным): если в ваших значениях есть дубликаты, вы получите только последнее.