Verifique se a variável é um número menor que um número dado ou igual ao texto “QUIT”

2

Eu gostaria de permanecer nesse loop contanto que $ CHOICE não seja "QUIT" ou um número menor que um dado inteiro (variável).

Estou usando isso: (22 como exemplo)

NUMBER=22
CHOICE=99
while [ "$CHOICE" -gt "$NUMBER" ] && [ "$CHOICE" != "QUIT" ]; do
  read CHOICE < /dev/tty
done

Mas se eu disser "teste", o script falha porque espera um inteiro no primeiro teste.

O que posso fazer para evitar esse problema?

    
por bob dylan 29.09.2018 / 15:01

3 respostas

2

O código a seguir fará um loop enquanto CHOICE não for "QUIT" ou um número inteiro menor que NUMBER:

NUMBER=22
while :; do
    read CHOICE
    case $CHOICE in
        QUIT) break;;
        *[!0-9]*|'') ;;
        *) test "$CHOICE" -lt "$NUMBER" && break;;
    esac
done

Se você também quiser que o loop saia quando o usuário inserir ^ D, você deverá colocar o read como a condição de loop: while read CHOICE; do case $CHOICE ... .

    
por 29.09.2018 / 16:08
1

Ajustes da resposta mosvy :

NUMBER=22
while read CHOICE ; do
  case "${CHOICE}" in
        QUIT)   break ;;
    *[!0-9]*)   ;;
          ?*)   [ "${CHOICE}" -lt $NUMBER ] && break ;;
  esac
done
  • Não coloque read no loop.
  • Não é necessário inicializar $CHOICE e
  • alterou *) para ?*) , tornando um menos condicional - o |'' do mosvy pode simplesmente passar.
por 29.09.2018 / 20:58
0

Você pode precisar de um teste adicional para caracteres alfa, como

while [ "$CHOICE" != "QUIT" ] && { [ "${CHOICE//[[:alpha:]]}" != "$CHOICE" ] || [ "$CHOICE" -gt 10 ]; }
  do    read CHOICE < /dev/tty
  done
    
por 29.09.2018 / 16:15

Tags