ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing
Так что здесь мы grep
вездесущий ip
инструмент stdout
для строки, которая содержит и наш интересующий интерфейс, и фразу «состояние ВВЕРХ» (спасибо @Lekensteyn за указание на необходимость немного большей специфичности, чем просто UP
). Мы используем аргумент a
в качестве краткой формы для address
и этого должно быть достаточно, чтобы получить список всех настроенных сетевых карт в системе.
Одним из преимуществ использования ip
может быть то, что он действительно должен быть доступен везде - например, я обычно настраиваю сетевые устройства моего телефона Android.
:colons
Используется , чтобы избежать частичных совпадений - таким образом , мы гарантируем соответствие для , eth0
в отличие от в противном случае возможно someothereth0
или eth007
.
Спасибо @RaphaelAhrens за то, что подтолкнули меня к правильности и объяснили мое решение.
РЕДАКТИРОВАТЬ:
Для обработки текущих требований вы можете:
ip a | sed -rn '/: '"$if"':.*state UP/{N;N;s/.*inet (\S*).*/\1/p}'
Вышеуказанный IP-адрес CIDR будет распечатан только в том случае, если ваша цель $if
- UP, подключена и имеет такой адрес . Для ipv6 решение такое же простое с незначительными изменениями.
Если вам не нравится, sed
вы могли бы достичь аналогичных результатов с другим |pipe ... grep
и добавив -A
контекстную опцию к первому grep
- но мне нравится sed
.
cat /sys/class/net/ | grep eth0
должен дать вам легко анализируемые данные. Вы также можете сделатьsudo ethtool eth0 | grep Link