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