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