While loop para inteiros com entrada do usuário

0

Eu comecei a programar no UNIX esta semana e uma das minhas tarefas é criar um script que leia números positivos até que -99 seja inserido e números negativos mostrem um erro (0 a -98). Isso é o que eu tenho, mas meio que preso. obrigado:)

#!/bin/bash

COUNTER=1

echo "Enter a positive integer number (-99 to quit):"
read NUMBER

echo "$NUMBER: "
while [ $NUMBER -ge $COUNTER ]; do
    echo $COUNTER
    ((COUNTER++))
done
    
por WickdLotus 22.09.2017 / 16:05

3 respostas

0

Se eu entendi corretamente, isso deve funcionar:

#! /bin/bash -

read -p "Enter a positive integer (-99 to quit): " USR_INT

while [[ -n "$USR_INT" ]]; do

    case "$USR_INT" in
        -99)
            echo "Exiting..."
            exit 0
            ;;
        -*)
            echo "Error, please enter a positive integer."
            exit 1
            ;;
        0)
            echo "Error, please enter a positive integer."
            exit 1
            ;;
        [0-9]*)
            echo "You have entered $USR_INT"
            ;;
        *)
            echo "Error, please enter a positive integer."
            exit 1
            ;;
    esac

    read -p "Enter a positive integer (-99 to quit): " USR_INT

done
    
por 22.09.2017 / 16:24
2
#!/bin/bash

while true; do
    read -p 'Number (-99 to quit): '

    if ! [[ "$REPLY" =~ ^-?[0-9]+$ ]]; then echo 'Error: Not an integer' >&2
    elif (( REPLY == -99 ));           then break
    elif (( REPLY <= 0   ));           then echo 'Error: Need positive integers >0' >&2
    else
        printf 'Got "%d", that is number %d\n' "$REPLY" "$(( ++c ))"
    fi
done

Este é um loop infinito que é encerrado quando o usuário digita -99 . Qualquer resposta de inteiro positivo solicitará que o código diga Got "some number" seguido de quantos números válidos foram lidos até o momento, enquanto um inteiro negativo, zero ou uma entrada não numérica fornecerá uma mensagem de diagnóstico no erro padrão. O código usa a variável REPLY , que é a variável gravada por read , se não for atribuído nenhum outro nome de variável.

O teste para entrada numérica correta é feito com a correspondência da resposta com a expressão regular ^-?[0-9]+$ . Esta expressão irá corresponder se a resposta estiver no formato esperado (um traço opcional seguido de pelo menos um dígito). Se não corresponder, uma mensagem de diagnóstico será emitida no erro padrão.

Até o primeiro elif , não podemos ter certeza de que $REPLY é um inteiro. Depois disso, usamos (( ... )) para avaliação aritmética das comparações.

O teste para -99 precisa vir antes do teste para inteiros negativos, pois de outra forma não teríamos como sair do loop.

    
por 22.09.2017 / 16:56
0

Mantendo a simplicidade:

!/bin/bash

while :
do
   echo "Enter a positive integer number (-99 to quit):"
   read NUMBER

   if (( NUMBER == -99 ))
   then
      exit
   fi

   echo "$NUMBER: "

   COUNTER=1
   while (( COUNTER <= NUMBER ))
   do
       echo $COUNTER
       ((COUNTER++))
   done
done
    
por 22.09.2017 / 16:26