Я новичок в написании сценариев 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
В чем вопрос:
Как мне преодолеть проблему «обработка подоболочки, приводящая к пустому массиву в конце» при обработке вывода команды?
Что я пробовал:
Итак, я думаю, что хочу:
- Go построчно.
- Изолировать поля 1 и 3 (имя и тип) из вывода команды.
- Сравните поле 3 для каждой строки с массивом FILTER.
- Сохраните поле 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[@]}
Я явно делаю что-то не так, поскольку это связано с обработкой результатов в подоболочках, думая, что я загружаю массив, но затем выхожу за пределы подоболочки, и он исчезает.