ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing
Então aqui nós grep
a ip
ferramenta 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 a
como o formato abreviado address
e isso deve ser suficiente para obter uma lista de todas as placas de rede configuradas no sistema.
Uma vantagem do uso ip
pode 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 someothereth0
ou 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, sed
poderá obter resultados semelhantes com outro |pipe ... grep
e adicionar uma -A
opção de contexto à primeira grep
- mas eu gosto sed
.
cat /sys/class/net/ | grep eth0
devo fornecer dados facilmente analisáveis. Você também pode fazersudo ethtool eth0 | grep Link