Как мне создать массив в bash из командной переменной? - PullRequest
2 голосов
/ 06 января 2012

Я пытаюсь получить SNMP-прогулку в массив, данные в переменной имеют формат "data1 data2" "data3 data4".По сути, я просто хочу, чтобы данные были заключены в двойные кавычки, независимо от количества пробелов.

Я гуглял около полутора часов и не могу понять, как правильно отформатировать массив.

Вот фрагмент кода, который у меня есть сейчас ...

IN=$(snmpwalk -Oqv -v2c -c$community $ipaddr .1.3.6.1.4.1.32050.2.1.26.2)
portdesc=($(echo $IN))

Это помещает его в массив, но при попытке получить доступ к первому набору данных я получаю "data1 вместо "data1 data2".Я могу обмануть и просто использовать две переменные, но я предпочел бы сделать это правильно и просто ссылаться на массив для элемента, который я хочу.Если вы можете помочь мне с этим, я буду вечно счастлив.

echo "DEBUG0: ${portdesc[@]}"
echo "DEBUG1: ${portdesc[0]}"

DEBUG0: "Relay Output" "Expansion Power" "Expansion Tripped" "Switch Input" "Radio 1 Power" "Radio 2 Power" "Radio 3 Power" "Radio 4 Power" "Radio 1 Sync" "Radio 2 Sync" "Radio 3 Sync" "Radio 4 Sync" "Radio 1 Tripped" "Radio 2 Tripped" "Radio 3 Tripped" "Radio 4 Tripped" "SyncPipe Power" "SyncPipe Tripped" "Switch to NMEA" "2D Fix" "3D Fix" "DGPS Fix" "1PPS Active" "Radio 1 Power" "Radio 2 Power" "Radio 3 Power" "Radio 4 Power" "Radio 1 Sync" "Radio 2 Sync" "Radio 3 Sync" "Radio 4 Sync" "Radio 1 Tripped" "Radio 2 Tripped" "Radio 3 Tripped" "Radio 4 Tripped" "SyncPipe Power" "SyncPipe Tripped" "Switch to NMEA" "2D Fix" "3D Fix" "DGPS Fix" "1PPS Active" "Radio 1 Power" "Radio 2 Power" "Radio 3 Power" "Radio 4 Power" "Radio 1 Sync" "Radio 2 Sync" "Radio 3 Sync" "Radio 4 Sync" "Radio 1 Tripped" "Radio 2 Tripped" "Radio 3 Tripped" "Radio 4 Tripped" "SyncPipe Power" "SyncPipe Tripped" "Switch to NMEA" "2D Fix" "3D Fix" "DGPS Fix" "1PPS Active"

DEBUG1: "Relay

SNMP-команда из CLI

$ snmpwalk -O qv -v2c -c<community> <ip> .1.3.6.1.4.1.32050.2.1.26.2
"Relay Output"
"Expansion Power"
"Expansion Tripped"
"Switch Input"
"Radio 1 Power"
"Radio 2 Power"
"Radio 3 Power"
"Radio 4 Power"
"Radio 1 Sync"
"Radio 2 Sync"
"Radio 3 Sync"
"Radio 4 Sync"
"Radio 1 Tripped"
"Radio 2 Tripped"

Ответы [ 2 ]

6 голосов
/ 06 января 2012

Я был бы более уверен в этом, если бы вы привели пример ввода (я не знаю, как выглядит вывод snmpwalk).Но насколько я понимаю, вы ожидаете, что массив будет разбивать текст только по новым строкам, а не по пробелам.По умолчанию bash разделяется на пробелы, табуляции и переводы строк.Чтобы изменить это поведение, вы можете изменить значение IFS ( I nput F ield S eparator):

OLDIFS="$IFS"
IFS=$'\n'      # newlines are the only separator
IN=($(my_command ...))
IFS="$OLDIFS"

Две дополнительные строки сохраняют и восстанавливают значение IFS на случай, если от этого зависят другие части вашего скрипта.

(Кстати, если вы гуглите «перевод строки массива bash», вы обнаружите некоторые вещи, объясняющие это.)

0 голосов
/ 06 января 2012

Попробуйте что-то вроде этого:

mlm@matt-mmf-macbook.local:~
$ a=( "data1 data2" "data3 data4" )

mlm@matt-mmf-macbook.local:~
$ echo "${a[0]}"
data1 data2

mlm@matt-mmf-macbook.local:~
$ echo "${a[1]}"
data3 data4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...