Můžete to udělat mnoha způsoby. Zde příklad:
$ cat /sys/class/net/eth0/operstate
up
ip a show ethX up
Pokud se nic nezobrazí, vaše rozhraní nefunguje
ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing
Takže tady máme grep všudypřítomné ip stdout nástroje pro řádek, který obsahuje jak naše rozhraní, které nás zajímá, tak frázi "stav UP" (děkujeme @Lekenstein za upozornění na potřebu trochu více specifičnosti než jen UP ). Použijeme argument a jako krátký formulář pro address a to by mělo stačit k získání seznamu všech nakonfigurovaných síťových karet v systému.
Jedna výhoda použití ip mohlo by to být tak, že by to opravdu mělo být dostupné všude – tak například běžně konfiguruji síťová zařízení svého telefonu Android.
:colons se používají k zamezení částečné shody – tímto způsobem garantujeme shodu pro eth0 na rozdíl od jinak možného someothereth0 nebo eth007 .
Děkuji @RaphaelAhrens za to, že mě popostrčil ke správnosti a vysvětlil mé řešení.
UPRAVIT:
Chcete-li zvládnout současné požadavky, můžete:
ip a | sed -rn '/: '"$if"':.*state UP/{N;N;s/.*inet (\S*).*/\1/p}'
Výše uvedené vytiskne IP adresu CIDR, pouze pokud je váš cíl $if je UP, zapojený a má jeden. Pro ipv6 je řešení stejně jednoduché jen s drobnými úpravami.
Pokud se vám nelíbí sed podobných výsledků byste mohli dosáhnout s jiným |pipe ... grep a přidání -A kontextová možnost na první grep - ale líbí se mi sed .