Remover citações
if ! [[ "$scale" =~ ^[0-9]+$ ]]
then
echo "Sorry integers only"
fi
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?
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.
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
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
( scale=${scale##*[!0-9]*}
: ${scale:?input must be an integer}
) || exit
Isso verifica e gera o seu erro.
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.