У меня есть многострочная строка, которую мне нужно перебрать, но я не использую 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 – это все, что осталось!

One Solution collect form web for “У меня есть многострочная строка, которую мне нужно перебрать, но я не использую bash. Совет?”

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

 while IFS= read -r DEVICE do .... done < your_file 
  • Изменение вхождения строки в файл при соблюдении новых строк строки DOS
  • Добавление ведущих символов перед строкой с использованием printf или echo
  • Стандарты для строк с двойными кавычками
  • Bash: как получить значение из массива для создания команды из него
  • Заменить всю строку в файле из командной строки
  • Проблема с sed в массиве, содержащем строки, содержащие пробелы
  • Может ли awk использовать идентификаторы полей также для строк оболочки (переменных)?
  • Как я могу правильно использовать команду sed в этом конкретном сценарии
  • bash - Разделить значения «таблицы» в строки в массиве
  • Объединение двух переменных приводит их в действие в Windows
  • Как я могу отредактировать редактируемый результат?
  • Interesting Posts

    Могу ли я узнать, запущен ли я в systemd?

    Еще одна синтаксическая ошибка около неожиданного токена `('

    Могу ли я безопасно удалить файл ~ / Trash?

    nfs-kernel-server запускается слишком рано

    Как помещать места сети и значок «Мой компьютер» на рабочем столе Fluxbox

    Как установить языковой стандарт cs_CZ.ISO8859-2 на Ubuntu 12.04

    Есть ли вариант часов, который обновляется только после получения сигнала?

    Как найти файлы, заканчивающиеся на ~ и pyc?

    Как отключить перемещение между рабочими областями?

    Как запустить `переустанавливать xkb-data` для Broken Installation в Live USB?

    Настройка Bash – Как оставить пробелы перед выводом команды?

    Как рандомизировать вывод из seq?

    cd во все каталоги, выполнить команду над файлами в этом каталоге и вернуться в предыдущий текущий каталог

    Как добавить шаблон к заполнению bash (для распаковки)?

    Почему я должен использовать sh для выполнения сценариев с CD / DVD-носителей?

    Linux и Unix - лучшая ОС в мире.