Shell Scripting: Comparando algo a nada?

1

Eu tenho este script para verificar a conectividade com a Internet. Eu uso ping para isso. Sempre que eu uso ping google.com -c 4 | grep time , produz uma resposta não vazia. Algo como %código%. Mas, quando a conectividade está inativa, a parte 64 bytes from hkg03s11-in-f4.1e100.net (173.194.127.68): icmp_req=2 ttl=52 time=90.6 ms não aparece, portanto, quando eu executo o mesmo comando, ele aparece como vazio. Como uso o time para isso? Estou confuso se devo usar if ou " " .

Qual deles eu uso?

""

ou

if [ 'ping google.com -c 4 | grep time' != " " ]; then

Observe o espaço entre o if [ 'ping google.com -c 4 | grep time' != "" ]; then

    
por pandalion98 16.03.2015 / 16:20

3 respostas

2

[ … != " " ] compara o lado esquerdo com uma string contendo um único espaço. [ … != "" ] compara o lado esquerdo com uma string vazia. A programação da shell tem esquisitices e armadilhas, mas esse caso em particular é direto.

'ping google.com -c 4 | grep time' é uma cadeia literal de 32 caracteres. Você supostamente pretendia usar a saída do comando, ou seja, um comando susbtitution . Você pode usar backquotes para isso (em vez das aspas que você usou), ou parêntese do dólar, que é mais legível e menos propenso a erros em alguns casos complexos. De qualquer forma, você precisa de aspas duplas em torno da coisa toda, caso contrário, o resultado da substituição do comando seria divididos em palavras e mais maldade .

if [ "$(ping google.com -c 4 | grep time)" != "" ]; then …

Tudo isso é uma maneira bastante rotatória e frágil de testar a conectividade. Use o status de retorno de ping . Provavelmente, um único pacote é suficiente e você deve especificar um tempo limite bem pequeno caso a rede esteja inativa. O ping google.com testa se a conectividade IP e o DNS estão funcionando. Você pode executar o ping de 8.8.8.8 para testar se a conectividade IPv4 está funcionando (8.8.8.8 é um servidor executado pelo Google).

if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; then
  echo "The network is up"
else
  echo "The network is down"
fi

Veja também Shell Scripting: Maneira correta de verificar a conectividade com a Internet?

    
por 17.03.2015 / 02:05
1

que tal

 if ping google.com -c 4
 then 
     ... OK
 else
     ... not OK
 fi

como a maioria dos comandos unix, o ping fornecerá um código de retorno que pode ser testado.

Para responder à pergunta original, você não pode escrever diretamente uma string vazia, você deve usar

if [ x'ping google.com -c 4 | grep time' != x ]; then
  • se ping google.com -c 4 | grep time fornecer uma string vazia x será igual a x
por 16.03.2015 / 16:28
-1

Entre as duas alternativas que você forneceu, mais tarde uma está correta:

if [ 'ping google.com -c 4 | grep time' != "" ]; then

Você pode armazenar something para uma variável, digamos var , e verificar se está vazia usando [ -z "$var ]" . Se estiver vazio, seu status de saída $? será zero.

Verifique:

$ var="something"
$ [ -z "$var" ]
$ echo $?
1

$ var=""
$ [ -z "$var" ]
$ echo $?
0

Você pode testar a conectividade com a Internet, você pode usar o seguinte:

ping  -s 1 -c 1 -W 2 -q www.google.com && echo "SUCCESS" || echo "FAILURE"

Com -s 1 , enviaremos apenas 1 byte de dados. Com -c 1 , enviaremos apenas um pacote ICMP. Com -W 2 , especificamos que, vamos aguardar apenas 2 segundos para uma resposta de ping.

    
por 17.03.2015 / 05:19