Restrições de entrada de inteiro

0

Eu quero fazer uma restrição de entrada em read :

Terminal Shell;

read x
read y
echo $(($x+$y))

Eu quero fazer uma restrição de x , quero que x seja -100 <= x <= 100 .
Qual é o comando que eu insiro antes de read x ?

    
por Fadh Nhz 04.02.2015 / 02:06

2 respostas

2

$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 .

    
por 04.02.2015 / 08:57
0

Você não pode fazer isso antes read x - você ainda não leu. Como você pode testar o desconhecido? A única solução é obter os dados e testá-los. Isso, no entanto, pode ser feito:

case ${#x}${x##?*[!0-9]*} in 
(?|[!1-4]*|4[!-]*|1-*|?[!-0-9]*) ! :;;
(*) echo "$(( x + y ))";;esac
    
por 04.02.2015 / 02:55