Compare uma variável que pode ter numérico ou string como valor

2

Eu tenho uma variável chamada Seconds_Behind_Master de um dos meus scripts. O problema é que essa variável pode ter um valor numérico ou também pode usar uma string NULL como seu valor. Agora, quando eu tento executar esse script no shell ele é executado, mas dá um aviso assim:

[: Illegal number: NULL

Acredito que seja devido ao fato de que, nesse caso, o valor é NULL , mas quando comparado com o valor numérico 60 , esse aviso é exibido. Como posso corrigir isso?

    
por Tarun 30.10.2013 / 09:41

2 respostas

2

Nesse caso, você deve usar uma avaliação aritmética - (( expression )) :

if (( $Seconds_Behind_Master >= 60 )); then
    echo "replication delayed > 60."
elif [ "$Seconds_Behind_Master" = "NULL" ]; then
    echo "Delay is Null."
fi

Se você quer respeitar o padrão POSIX, então você pode usar:

if echo $Seconds_Behind_Master | egrep -q '^[0-9]+$' && [ "$Seconds_Behind_Master" -ge "60" ] ; then
    echo "replication delayed >= 60."
elif [ "$Seconds_Behind_Master" = "NULL" ]; then
    echo "Delay is Null."
fi

Mais sobre: Shell - Teste uma variável numérica .

    
por Radu Rădeanu 30.10.2013 / 10:22
1

Verifique se o var é NULL primeiro e, em seguida, verifique se é >= 60 . Considere este código:

if [ "$Seconds_Behind_Master" = "NULL" ]; then
    echo "Delay is Null."
elif [ "$Seconds_Behind_Master" -ge 60 ] 2>/dev/null; then
    echo "replication delayed >= 60."
else
    echo "Seconds_Behind_Master is neither NULL or >= 60"
fi

Você também pode substituir a linha

elif [ "$Seconds_Behind_Master" -ge 60 ] 2>/dev/null; then

com

elif [[ "$Seconds_Behind_Master" -ge 60 ]]; then

se você preferir e estiver usando um shell que suporta a sintaxe [[ .

    
por kiri 30.10.2013 / 09:46