ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing
Отож, тут ми grep
є всюдисущим ip
інструментом stdout
для рядка, який містить як наш інтерфейс, що цікавить, так і фразу "state UP" (завдяки @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