Назад | Перейти на главную страницу

Не работает корректно скрипт в bash

Мне нужно получить интерфейс по номеру. Мой сценарий:

#!/bin/bash

interfaces=/root/tt
interfaces_with_numbers=/root/tt2

ls -1 /sys/class/net > /root/tt
cat -n $interfaces > $interfaces_with_numbers
cat $interfaces_with_numbers

read number
echo $number

eth=`cat $interfaces_with_numbers | grep $number | awk '{ print $2 }'`

if [[ -d /sys/class/net/$eth ]];then
    echo "You choose is: $eth"
else
    echo "not found"
fi

У меня есть вывод:

 1  dummy0
 2  eno1
 3  enp4s0
 4  lo
 5  virbr0
 6  virbr0-nic

Это просто текстовый файл с пробелами. Хорошо. Скрипт спросил, что я хочу ввести. Я ввел «2». Он работает - в результате я получаю имя интерфейса. Я ввел «1», а у меня «не найдено». Я написал в командной строке Linux:

cat tt2 | grep 1 | awk '{ print $2 }'

И у меня есть результат:

dummy0
eno1

Как правильно сделать этот скрипт? Пожалуйста помоги. Спасибо за внимание.

В зависимости от того, какой интерфейс вы выберете, grep может найти несколько ответов. Например, выбор пункта меню №1 заставит grep найти оба 1 dummy0 и 2 eno1. Это приводит к тому, что grep возвращает два результата, разделенных символом новой строки. например:

eth='dummmy0 eno1'

когда -d пытается оценить eth, он пытается вычислить всю переменную, включая возврат каретки, и оператор, очевидно, возвращает false. Попробуйте использовать egrep с регулярным выражением для исправления. ^\s+$number будет искать совпадение только в начале строки. в \s+ будет учитывать табуляции или другие пробелы перед числом:

eth=`cat $interfaces_with_numbers | egrep "^\s+$number" | awk '{ print $2 }'

Вы могли бы использовать awk чтобы точно проверить условие соответствия:

eth=`awk "(\$1==$number) { print \$2 }" $interfaces_with_numbers`