ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing
Así que aquí tenemos greplas ipherramientas ubicuas stdoutpara 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 acomo forma abreviada addressy eso debería ser suficiente para obtener una lista de todas las tarjetas de red configuradas en el sistema.
Una ventaja de usar ippodrí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 :colonsutilizan para evitar coincidencias parciales, de esta manera garantizamos una coincidencia en eth0lugar de una posible someothereth0o 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 $ifestá 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 ... grepy agregar una -Aopción de contexto a la primera grep, pero me gusta sed.
cat /sys/class/net/ | grep eth0debería darle datos fácilmente analizables. También podría hacerlosudo ethtool eth0 | grep Link