Мне нужно получить интерфейс по номеру. Мой сценарий:
#!/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`