ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing
Así que aquí tenemos grep
las ip
herramientas ubicuas stdout
para una línea que contiene tanto nuestra interfaz de interés como la frase "estado ARRIBA" (gracias a @Lekensteyn por señalar la necesidad de un poco más de especificidad que simplemente UP
). Usamos el argumento a
como forma abreviada address
y eso debería ser suficiente para obtener una lista de todas las tarjetas de red configuradas en el sistema.
Una ventaja de usar ip
podría ser que realmente debería estar disponible en todas partes; es cómo configuro comúnmente los dispositivos de red de mi teléfono Android, por ejemplo.
Se :colons
utilizan para evitar coincidencias parciales, de esta manera garantizamos una coincidencia en eth0
lugar de una posible someothereth0
o no eth007
.
Gracias @RaphaelAhrens por empujarme hacia la corrección y explicar mi solución.
EDITAR:
Para manejar los requisitos actuales puede:
ip a | sed -rn '/: '"$if"':.*state UP/{N;N;s/.*inet (\S*).*/\1/p}'
Lo anterior solo imprimirá una dirección IP CIDR si su objetivo $if
está ARRIBA, enchufado y tiene una. Para ipv6, la solución es igual de simple con solo modificaciones menores.
Si no le gusta sed
, podría lograr resultados similares con otro |pipe ... grep
y agregar una -A
opción de contexto a la primera grep
, pero me gusta sed
.
cat /sys/class/net/ | grep eth0
debería darle datos fácilmente analizables. También podría hacerlosudo ethtool eth0 | grep Link