Script de shell UNIX: usando “case” para validar a entrada do usuário

1

Estou tentando validar a entrada do usuário. Assim, a entrada é um número que não uma string ou nulo. usando caso eu tentei fazer isso

echo "input a number"
read num1

case $num1 in 
"" |*[a-zA-Z]*)
echo "please inter a valid number"
esac

echo "input 2nd number"
read num2



let sum=$num1+$num2
echo "$num1 + $num2=$sum"

Mas não funcionou bem. Isso me dá o aviso sobre a entrada embora - E está lá para validar as duas variáveis no sametime?

    
por user128174 07.07.2017 / 05:05

3 respostas

1

Usando o bash você pode usar uma expressão regular para validar o número:

#! /bin/bash
while [ -z "$REPLY" ]; do
    read -p "Enter a valid number: "
    if ! [[ "$REPLY" =~ ^[0-9]+$ ]] ; then
        echo Bad number: $REPLY
        REPLY=
    fi
done
echo A valid number: $REPLY

O programa continua lendo a entrada até a variável $REPLY ser definida por read . Quando o número é comparado com ^[0-9]+$ , o loop é finalizado.

    
por 07.07.2017 / 08:31
1

Para verificar as duas variáveis de uma só vez, você pode concatenar e verificar.

Aqui está a parte que muda:

case $num1$num2 in 
'' |*[!0-9]*)
    echo "please enter a valid number"
    exit
    ;;

Você também pode usar exit para sair logo após a impressão do erro.

    
por 07.07.2017 / 05:30
0

Você pode definir uma função personalizada para fazer isso.

# func def.
isInt() {
    case ${1-} in '' | *[!0-9]* ) return 1 ;; esac
    return 0
}

# now use it as:
if isInt "$num1"; then
   echo "$num1 is a valid integer"
else
   echo "$num1 is not an integer"
fi

Observe que case usa caracteres curinga e não regexes para seu trabalho.

    
por 07.07.2017 / 12:18