ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing
Tak więc tutaj jesteśmy grepwszechobecnym ipnarzędziem stdoutdla 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 ajako krótkiego formularza, addressktóry powinien wystarczyć, aby uzyskać listę wszystkich skonfigurowanych kart sieciowych w systemie.
Jedną z zalet używania ipmoż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żą :colonsone do unikania częściowych dopasowań - w ten sposób gwarantujemy dopasowanie do, eth0a nie do innych możliwych someothereth0lub 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 $ifjest 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, sedmożesz osiągnąć podobne wyniki z innym |pipe ... grepi dodając -Aopcję kontekstową do pierwszego grep- ale lubię sed.
cat /sys/class/net/ | grep eth0powinienem dać ci łatwo parsowalne dane. Możesz także zrobićsudo ethtool eth0 | grep Link