Я пытаюсь заполнить ассоциативный массив в bash из следующего файла примера
interface GigabitEthernet1/0/1
srr-queue bandwidth share 10 10 60 20
priority-queue out
mls qos trust dscp
interface GigabitEthernet1/0/2
mls qos trust dscp
interface GigabitEthernet1/0/3
interface GigabitEthernet1/0/4
srr-queue bandwidth share 10 10 60 20
priority-queue out
mls qos trust dscp
interface GigabitEthernet1/0/5
srr-queue bandwidth share 10 10 60 20
priority-queue out
mls qos trust dscp
interface GigabitEthernet1/0/6
srr-queue bandwidth share 10 10 60 20
priority-queue out
mls qos trust dscp
interface GigabitEthernet1/0/7
srr-queue bandwidth share 10 10 60 20
priority-queue out
mls qos trust dscp
interface GigabitEthernet1/0/8
srr-queue bandwidth share 10 10 60 20
priority-queue out
mls qos trust dscp
interface GigabitEthernet1/0/1
или GigabitEthernet1/0/1
должен быть ключом массива, а что-либо между разделами интерфейса должно быть значением ключа массива.
srr-queue bandwidth share 10 10 60 20
priority-queue out
mls qos trust dscp
Ожидаемый вывод должен быть:
$echo ${array[GigabitEthernet1/0/4]}
srr-queue bandwidth share 10 10 60 20
priority-queue out
mls qos trust dscp
Будет несколько разных файлов с одинаковым форматом, так что это нужно сделать с помощью l oop, текст между интерфейсами должен быть от 0 до 5-6 строк. Причина в том, что мне нужно сделать логический тест на каждом интерфейсе, если он правильный или нет. Ниже текст верен, все остальное или пустое поле неверно.
srr-queue bandwidth share 10 10 60 20
priority-queue out
mls qos trust dscp
До сих пор я придерживался форматирования IFS и мультилиней в качестве значения ключа массива. Мне удалось заполнить неассоциативный массив, но не в самой чистой форме.
$ cat test_compare_interface | sed 's/interface.*$/*\n&/g' > test_compare_interface_sed
test_compare_interface - файл с интерфейсами
$ IFS=$'*' && array=($(cat test_compare_interface_sed))
$ echo ${array[4]}
interface GigabitEthernet1/0/4
srr-queue bandwidth share 10 10 60 20
priority-queue out
mls qos trust dscp
С ассоциативным массивом l oop, я все еще борюсь
while IFS='*' read -r interface value; do array[$interface]=$value ; done < test_compare_interface_sed
Спасибо за все предложения .