Verificando se um número de entrada é um inteiro

15

Estou tentando verificar se uma entrada é um número inteiro e passei por ela cem vezes, mas não vejo o erro. Infelizmente não funciona, ele aciona a declaração if para todas as entradas (números / letras)

read scale
if ! [[ "$scale" =~ "^[0-9]+$" ]]
        then
            echo "Sorry integers only"
fi

Eu brinquei com as citações, mas ou perdi ou não fiz nada. O que eu faço de errado? Existe uma maneira mais fácil de testar se uma entrada é apenas um INTEGER?

    
por lonewarrior556 22.08.2014 / 19:22

6 respostas

12

Remover citações

if ! [[ "$scale" =~ ^[0-9]+$ ]]
    then
        echo "Sorry integers only"
fi
    
por 22.08.2014 / 19:38
8

Use o operador -eq do comando test :

read scale
if ! [ "$scale" -eq "$scale" ] 2> /dev/null
then
    echo "Sorry integers only"
fi

Ele não funciona apenas em bash , mas também em qualquer shell POSIX. Da documentação do POSIX teste :

n1 -eq  n2
    True if the integers n1 and n2 are algebraically equal; otherwise, false.
    
por 22.08.2014 / 19:25
4

Para números inteiros não assinados eu uso:

read -r scale
[ -z "${scale//[0-9]}" ] && [ -n "$scale" ] || echo "Sorry integers only"

Testes:

$ ./test.sh
7
$ ./test.sh
   777
$ ./test.sh
a
Sorry integers only
$ ./test.sh
""
Sorry integers only
$ ./test.sh

Sorry integers only
    
por 15.10.2016 / 03:10
4

Como o OP parece querer apenas inteiros positivos:

[ "$1" -ge 0 ] 2>/dev/null

Exemplos:

$ is_positive_int(){ [ "$1" -ge 0 ] 2>/dev/null && echo YES || echo no; }
$ is_positive_int word
no
$ is_positive_int 2.1
no
$ is_positive_int -3
no
$ is_positive_int 42
YES

Observe que um único teste [ é necessário:

$ [[ "word" -eq 0 ]] && echo word equals zero || echo nope
word equals zero
$ [ "word" -eq 0 ] && echo word equals zero || echo nope
-bash: [: word: integer expression expected
nope

Isso ocorre porque a desreferência ocorre com [[ :

$ word=other
$ other=3                                                                                                                                                                                  
$ [[ $word -eq 3 ]] && echo word equals other equals 3
word equals other equals 3
    
por 26.05.2017 / 13:56
2
( scale=${scale##*[!0-9]*}
: ${scale:?input must be an integer}
) || exit

Isso verifica e gera o seu erro.

    
por 23.08.2014 / 06:23
1

Please check How do I test if a variable is a number in Bash stackoverflow page. This page have some other good ways for checking integer number.

    
por 30.09.2018 / 07:52