Verificando os resultados de um comando no script Bash

3

Estou lendo "Advanced Bash-Scripting Guide" no momento. Há algum script que não está funcionando corretamente na minha máquina:

HNAME=news-15.net # Notorious spammer.
# HNAME=$HOST
# Debug: test for localhost.
count=2 # Send only two pings.
if [[ 'ping -c $count "$HNAME"' ]]
then
echo ""$HNAME" still up and broadcasting spam your way."
else
echo ""$HNAME" seems to be down. Pity."
fi

Ele sempre imprime $HNAME" still up and broadcasting spam your way. - mesmo com endereços IP inexistentes. Alguém pode esclarecer qual é o problema?

Funciona corretamente quando eu uso um nome de host em vez de um endereço IP.

    
por Артём Григорьев 16.08.2018 / 13:24

2 respostas

10
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:

por 16.08.2018 / 16:02
3

Como você mencionou na pergunta even with nonexistent ip . Se você pingar IP em vez de um domínio. Você deve tentar a abordagem abaixo para obter o resultado desejado.

HNAME=192.168.1.21 
count=2 # Send only two pings.
if ping -c $count "$HNAME" 2> /dev/null
then
    echo "\"$HNAME\" still up and broadcasting spam your way."
else
    echo "\"$HNAME\" seems to be down. Pity."
fi
    
por 16.08.2018 / 13:58