Bash Скрипт - Загрузка массивов на основе вывода команды - PullRequest
1 голос
/ 03 августа 2020

Я новичок в написании сценариев bash, поэтому, пожалуйста, познакомьтесь со мной, пока я учусь здесь. Я пытаюсь проверить некоторые соединения NetworkManger с помощью скрипта. Я застрял в том, как получить отфильтрованный список имен подключений на основе их типа. В частности, я хочу иметь массив в скрипте:

declare -a FILTER
FILTER=(bond ethernet)

А затем запустить его члены против вывода команды nmcli con show, чтобы возвращать только соединения, которые имеют тип, соответствующий член массива FILTER (в приведенном ниже примере это будет означать только «Bond0»). Я хочу сохранить совпадения в массиве RESULTS.

Например, nmcli con show производит:

NAME        UUID            TYPE        DEVICE
Bond0       akjkajfljklfa   bond        ifbond
Wi-Fi       jkjkjjkljahjh   wifi        wlo

В чем вопрос:

Как мне преодолеть проблему «обработка подоболочки, приводящая к пустому массиву в конце» при обработке вывода команды?

Что я пробовал:

Итак, я думаю, что хочу:

  1. Go построчно.
  2. Изолировать поля 1 и 3 (имя и тип) из вывода команды.
  3. Сравните поле 3 для каждой строки с массивом FILTER.
  4. Сохраните поле 1 в RESULTS, если поле 3 совпадает с элементом массива FILTER.

Я пробовал использовать трубопровод nmcli выводит в IFS= -r line; do и передает $line в awk различными способами, затем загружает array -a RESULTS с помощью набора различных методов, таких как al oop, а также с помощью mapfile -t RESULS < <(command substitution) et c.

Пока я могу добраться до точки со всеми методами, где это выглядит как строка, используемая для загрузки совпадений в массив RESULTS (set -x показывает, что это повторно переворачивая правильные имена и загружая их в массив), когда я выхожу из любого механизма, который я использовал для загрузки массива RESULTS, он всегда пуст, когда I echo ${RESULTS[@]} с длиной 0.

I у меня нет всего кода, который я пробовал, но, грубо говоря, вот часть моей последней неудачи (извините, мне пришлось перепечатать все это на другом компьютере, чтобы опубликовать этот вопрос, следовательно, не все, так как есть намного больше в скрипте):

declare -a FILTER
FILTER=(bond ethernet)
declare -a RESULTS

nmcli con show | while IFS= read -r line
do
   # A bunch of if's and so forth to to filter the right things, example: #
   if [[ " ${FILTER[@]} " =~ " $(echo $line | awk {`print $3`} "]]; then
   mapfile -t RESULTS < <(nmcli con show | while IFS= read -r line; do echo $line | awk '{print $1}`)
   fi
done
echo ${RESULTS[@]}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...