У меня есть многострочная строка, которую мне нужно перебрать, но я не использую bash. Совет?

Я использую Dash, потому что это нужно запустить на моем rPi. Баш не вариант.

Я переписываю скрипт Bash для работы с Dash. Я надеюсь сделать это как совместимый с POSIX (переносным), насколько это возможно. Дело в том, что сложно найти помощь в том, как делать циклы через многострочные строки, которые не включают Bash.

Мой скрипт работает до тех пор, пока я не дойду до точки, где мне нужно пройти через список от 100 до 1000 устройств, каждый на своей строке в текстовом файле. Например, файл может выглядеть примерно так:

foo bar device blah 

Я импортирую слова с помощью простой команды cat : LIST="$(cat $2)" . Отсюда мне нужно перебрать каждое слово в $LIST :

 for ARRAY in ${LIST} do printf "Getting VLANS for: $ARRAY" VLANS=$(snmpbulkwalk -v 2c -t 2 -r 3 -c "$COMMUNITY" "$ARRAY.dcs.byu.edu" XIRRUS-MIB::vlanName -Oqv) printf "$ARRAY,$VLANS" >> "$REPORT" done 

Когда цикл начинается $ARRAY значительной степени печатается все, что есть в $LIST , что делает его бессмысленным. Очень важно, чтобы в $ARRAY snmpbulkwalk только одно слово, поскольку snmpbulkwalk может обрабатывать только одно устройство за раз. Он будет возвращать все данные как одну многострочную строку, однако это можно легко обработать с помощью sed чтобы заменить каждую новую строку запятой.

Итак, что является правильным и / или эффективным методом повторения каждого слова в строке? Массивы, насколько я понимаю, в Dash довольно несуществуют, делая мутации немного сложнее. Я пробовал использовать руководство Ubuntu и эту очень полезную ссылку . Когда я пишу это, я начинаю думать, что мне, возможно, придется попробовать использовать grep для чтения строки за строкой и вложить другой цикл for, но я не уверен, есть ли более простой, «чистый» способ.


Вы, ребята, фантастичны! Быстрые, чистые ответы и некоторые примеры.

Итак, я создал две разные версии скрипта, оба из которых отлично работают. Первое было сделано, как описано roaima, и также было предложено steeldriver. Я заменил мой цикл на некоторое while , чтобы вместо этого читать файл по очереди. Спасибо за это, это, безусловно, помогает упростить вещи и показывает, что в моем случае массивы не нужны.

Моя вторая версия просто заменила printf "Getting VLANS for: $ARRAY" с echo "Getting VLANS for: $ARRAY" и в итоге я просто удалил его, чтобы посмотреть, что произойдет. Каким-то образом это имело значение: ARRAY не содержало все, что было в LIST что позволило остальной части кода работать правильно. Если кто-то хочет уточнить, как это работает, сделайте это в комментариях.

Еще раз спасибо ребятам! Он работает намного быстрее, чем раньше, на Bash. Еще несколько настроек для анализа данных snmp – это все, что осталось!

Так я читал строку за раз из файла

 while IFS= read -r DEVICE do .... done < your_file