Bash Script se a condição for sempre verdadeira

3

Estou tentando criar um manipulador de eventos para o glacê. Meu script Bash se parece com isso agora:

#!/bin/bash
# Event Handler for loggin out inactive RDP users

# $1 is $SERVICESTATE$ (OK WARNING UNKNOWN CRITICAL)
# $2 is $SERVICESTATETYPE$ (SOFT HARD)
# $3 is $SERVICEATTEMPT$ (1 through 4)
# $4 is $SERVICDOWNTIME$ (0 no Downtime, >0 Downtime active)
# $5 is SRV29 
# $6 is $host.name$ (1 through 4)


if  [ "$4" > 0 ];
 echo "in downtime, exit";
 then exit
fi

case "$1" in
OK)
echo "ok!"
;;
WARNING)
echo "warning!"
;;
UNKNOWN)
echo "unknown!"
;;
CRITICAL)
echo "critical!"
...

Quando executo este script sem a declaração if no topo, tudo funciona bem. Mas eu quero verificar se $ 4 é maior que 0. Esta condição de teste sempre retorna true e não importa o que eu insiro dentro dessa condição sempre resulta em "intime, exit".

Então, mesmo if [ "hello" = "hallo" ] entrará e sairá imediatamente. Eu também tentei praticamente todas as variações com aspas, sem colchetes duplos ... e assim por diante. Eu estou obviamente fazendo algo errado. Alguém consegue identificá-lo?

Obrigado antecipadamente!

    
por mike.b93 24.03.2017 / 17:55

3 respostas

8

Para testar números inteiros, você vai querer usar:

-eq  #Is equal
-ne  #Is not equal
-lt  #Less than
-le  #Less than or equal
-gt  #Greater than
-ge  #Greater than or equal

Portanto, a sua declaração test deve ser:

if  [ "$4" -gt 0 ];

Além disso, sua instrução if não possui o then , por isso deve ser corrigido para:

if  [ "$4" -gt 0 ]; then

Veja man test para mais opções test .

    
por 24.03.2017 / 18:03
3

Sua declaração if está toda danificada.

if [ "$4" -gt 0 ]; then
   # stuff to do when $4 > 0
else
   # stuff to do when $4 <= 0
fi
    
por 24.03.2017 / 18:20
1
if  [ ... ];
    echo "in downtime, exit";
    then exit
fi

Como as outras respostas mencionam, a palavra-chave then está no lugar errado nessa condição if . (Não está faltando, do ponto de vista da linguagem shell. Se fosse, isso seria um erro de sintaxe.)

O que acontece aqui, é que os comandos ambos antes de then são considerados como parte da condição, e o valor de retorno de todo o lote é usado para escolher se a peça está em then corre. Com comandos separados por ponto-e-vírgula, apenas o status de saída do último comando é importante.

Como echo provavelmente será sempre bem-sucedido, a ramificação condicional sempre será executada. Algo como if true; false; then echo something; fi nunca executaria o echo . Sugiro colocar a palavra-chave then na mesma linha que a condição, para evitar adicionar algo acidentalmente entre elas.

Com if , o uso de vários comandos na condição provavelmente será confuso, mas com while pode ter seus usos: poderíamos ter algo assim:

while value=$(somecommand) ; [ "$value" != 0 ] ; do
    echo "do some work with $value"
done

Tanto a atribuição quanto o teste são executados em cada iteração do loop.

    
por 25.03.2017 / 10:42

Tags