Por favor, diga como este comando verifica se o rnum tem um inteiro ou não

1

Eu vi um constructo como este em um script de shell, sendo usado para testar se $rnum é um número:

if ! [ "$rnum" -eq "$rnum" ] 2> /dev/null; then
    echo "rnum is not a number"
    exit 1
fi

Parece funcionar, mas eu não entendo por que - não deveria testar algo para igualdade contra si mesmo ser sempre verdadeiro? Como / por que isso funciona?

    
por Ranjith 21.12.2016 / 10:49

2 respostas

0

Ulrich Schwarz realmente respondeu à pergunta já em seu comentário. Apenas deixe de fora o 2>/dev/null e veja o que acontece quando $rnum não é um inteiro. Considere o seguinte exemplo escrito em uma sessão bash interativa:

$ rnum='foo'
$ [ "$rnum" -eq "$rnum" ]
-bash: [: foo: integer expression expected
$ echo $?
2

Se você estiver procurando por um método alternativo para testar se um valor é um inteiro, a Prashant Band já deu um. No entanto, eu prefiro uma solução mais portátil (uma que não dependa do operador =~ ):

expr "X$rnum" : 'X[-+]\{0,1\}[0-9]\{1,\}$' >/dev/null || {
    echo 'rnum is not a number' >&2
    exit 1
}

Observe que valores estranhos como -0 , +0 e 000 são tratados como inteiros. No entanto, esse é o mesmo comportamento que você teria usando o constructo original apresentado em sua pergunta.

    
por 01.01.2017 / 00:20
-1

Este script verifica se é um número ou não:

num=123
if [[ "$num" =~ ^[0-9]+$ ]]
then
echo "It is Number"
fi
    
por 21.12.2016 / 11:15