Puoi farlo in molti modi. Ecco un esempio:
$ cat /sys/class/net/eth0/operstate
up
ip a show ethX up
Se non viene visualizzato nulla, la tua interfaccia non funziona
ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing
Quindi qui abbiamo grep
l'onnipresente ip
stdout
dello strumento per una riga che contiene sia la nostra interfaccia di interesse sia la frase "state UP" (grazie a @Lekensteyn per aver sottolineato la necessità di un po' più di specificità rispetto al solo UP
). Usiamo l'argomento a
come forma abbreviata di address
e questo dovrebbe essere sufficiente per ottenere un elenco di tutte le schede di rete configurate nel sistema.
Un vantaggio nell'usare ip
potrebbe essere davvero disponibile ovunque:è così che configuro comunemente i dispositivi di rete del mio telefono Android, ad esempio.
Il :colons
vengono utilizzati per evitare corrispondenze parziali - in questo modo garantiamo una corrispondenza per eth0
al contrario di un someothereth0
altrimenti possibile o eth007
.
Grazie @RaphaelAhrens per avermi spinto verso la correttezza e aver spiegato la mia soluzione.
MODIFICA:
Per gestire i requisiti attuali potresti:
ip a | sed -rn '/: '"$if"':.*state UP/{N;N;s/.*inet (\S*).*/\1/p}'
Quanto sopra stamperà un indirizzo IP CIDR solo se il tuo obiettivo è $if
è SU, collegato e ne ha uno. Per ipv6 la soluzione è altrettanto semplice con solo piccole modifiche.
Se non ti piace sed
potresti ottenere risultati simili con un altro |pipe ... grep
e aggiungendo un -A
opzione di contesto al primo grep
- ma mi piace sed
.