Не работает скрипт в 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

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

0
задан 15 November 2016 в 16:38
2 ответа

В зависимости от того, какой интерфейс вы выберете, 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 }'
1
ответ дан 4 December 2019 в 16:26

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

eth=`awk "(\$1==$number) { print \$2 }" $interfaces_with_numbers`
0
ответ дан 4 December 2019 в 16:26

Теги

Похожие вопросы