ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing
Então aqui nós grepa ipferramenta onipresentestdout uma linha que contém a nossa interface de interesse e a frase "state UP" (obrigado a @Lekensteyn por apontar a necessidade de um pouco mais de especificidade do que apenas UP). Usamos o argumento acomo o formato abreviado addresse isso deve ser suficiente para obter uma lista de todas as placas de rede configuradas no sistema.
Uma vantagem do uso ippode ser que ele realmente deve estar disponível em qualquer lugar - é como eu geralmente configuro os dispositivos de rede do meu telefone Android, por exemplo.
o :colons são usados para evitar correspondências parciais - dessa forma, garantimos uma correspondência para eth0, ao contrário de um someothereth0ou de outra forma possível eth007.
Obrigado @RaphaelAhrens por me sugerir a correção e explicar minha solução.
EDITAR:
Para lidar com os requisitos atuais, você pode:
ip a | sed -rn '/: '"$if"':.*state UP/{N;N;s/.*inet (\S*).*/\1/p}'
O texto acima apenas imprimirá um endereço IP do CIDR se o seu destino $if estiver em UP, conectado e tiver um. Para o ipv6, a solução é tão simples com apenas pequenas modificações.
Se você não gostar, sedpoderá obter resultados semelhantes com outro |pipe ... grepe adicionar uma -Aopção de contexto à primeira grep- mas eu gosto sed.
cat /sys/class/net/ | grep eth0devo fornecer dados facilmente analisáveis. Você também pode fazersudo ethtool eth0 | grep Link