ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing
Tak więc tutaj jesteśmy grep
wszechobecnym ip
narzędziem stdout
dla linii, która zawiera zarówno nasz interesujący interfejs, jak i zwrot „stan UP” (dzięki @Lekensteyn za wskazanie potrzeby nieco większej szczegółowości niż tylko UP
). Używamy tego argumentu a
jako krótkiego formularza, address
który powinien wystarczyć, aby uzyskać listę wszystkich skonfigurowanych kart sieciowych w systemie.
Jedną z zalet używania ip
może być to, że naprawdę powinien być dostępny wszędzie - w ten sposób na przykład często konfiguruję urządzenia sieciowe mojego telefonu z Androidem.
Służą :colons
one do unikania częściowych dopasowań - w ten sposób gwarantujemy dopasowanie do, eth0
a nie do innych możliwych someothereth0
lub eth007
.
Dzięki @RaphaelAhrens za popychanie mnie do poprawności i wyjaśnianie mojego rozwiązania.
EDYTOWAĆ:
Aby obsłużyć obecne wymagania, możesz:
ip a | sed -rn '/: '"$if"':.*state UP/{N;N;s/.*inet (\S*).*/\1/p}'
Powyżej wydrukuje adres IP CIDR tylko wtedy, gdy twój cel $if
jest włączony , podłączony i ma go. W przypadku ipv6 rozwiązanie jest równie proste z niewielkimi modyfikacjami.
Jeśli ci się nie podoba, sed
możesz osiągnąć podobne wyniki z innym |pipe ... grep
i dodając -A
opcję kontekstową do pierwszego grep
- ale lubię sed
.
cat /sys/class/net/ | grep eth0
powinienem dać ci łatwo parsowalne dane. Możesz także zrobićsudo ethtool eth0 | grep Link