$x
é uma string. Um usuário pode digitar qualquer coisa, não é necessariamente um número. A validação de entrada vem após entrada. Você tem que verificar se é um inteiro, e então você pode fazer uma comparação aritmética. Por exemplo
read x
#validate if it is an integer
[[ "$x" =~ -?[0-9]+ ]] || echo error
#validate range (this is better done algebraically, not with string manipulation)
(( x >= -100 && x <= 100 )) || echo error
# carry on
a propósito, a expressão de avaliação aritmética em $(( ... ))
pode usar nomes de variáveis, não expansões variáveis. Apenas escreva $(( x + y ))
.
Solução para puritanos:
x=$(awk '/^-?[0-9]+\s*$/{ if ($1<=100 && $1>=-100){ print; exit; } } { exit 1; }') || echo error
Nesse caso, awk
lê a entrada, não o shell, mas também é possível fazer isso com read
e, em seguida, filtrar o resultado. Em vez de echo error
, você pode usar a expressão em um loop (que solicita novamente o usuário para outra entrada) ou apenas resgatar com exit 1
.