if [[ 'ping -c $count "$HNAME"' ]]
Isso executa ping
em uma substituição de comando (usando a antiga sintaxe de backtick, em vez de a saner $(...)
). A saída resultante é colocada na linha de comando e, em seguida, [[ .. ]]
, testa para ver se a saída está vazia. (Ou seja, saída regular. A substituição de comando não captura a saída de erro, que ainda seria enviada para a saída de erro do script).
Se ping
produzir alguma coisa, o teste será bem-sucedido. Por exemplo. no meu sistema:
$ ping -c1 1.2.3.4 2>/dev/null
PING 1.2.3.4 (1.2.3.4) 56(84) bytes of data.
--- 1.2.3.4 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
Como 1.2.3.4
é um endereço IP válido, ping
tenta contatá-lo. Com um endereço IP inválido ou um nome de host inexistente, ele só imprimiria um erro e a saída padrão estaria vazia.
A melhor maneira de testar se um host está ativo seria testar o status de saída de ping
e redirecionar sua saída:
host=1.2.3.4
if ping -c1 "$host" >/dev/null 2>&1; then
echo "'$host' is up"
else
echo "'$host' does not respond (or invalid IP address/hostname)"
fi
Observe que a cotação nos comandos echo
está desativada:
echo ""$HNAME" seems to be down."
Isso tem uma string entre aspas vazia ""
, depois uma expansão de parâmetro sem aspas $HNAME
e, em seguida, a string entre aspas " seems to be down."
. Por várias razões, é melhor citar todas as expansões de paremeter, então use "$var blahblah"
, ou "\"$var\" blahblah"
se você quiser colocar aspas ao redor da variável na saída.
Veja: