2009-05-11 4 views
7

J'ai écrit un script bash qui prend des nombres pour le calcul via une entrée utilisateur. Le problème que j'ai est que si l'utilisateur tape une lettre ou un espace par erreur, le script entier échoue et l'utilisateur doit recommencer.Bash: vérifier que l'entrée de l'utilisateur est correcte

Il doit y avoir un moyen facile de vérifier l'entrée est numérique uniquement qui demandera à l'entrée à nouveau si quelque chose d'autre est entré accidentellement?

Répondre

17

Utilisez une boucle while

number="" 
while [[ ! $number =~ ^[0-9]+$ ]]; do 
    echo Please enter your age 
    read number 
done 
echo You are $number years old 
+0

Oui qui fonctionne, merci, mais im réutiliser la même variable donc la prochaine fois qu'il vient autour d'elle a une valeur de la dernière entrée. des idées? –

+0

Je ne comprends pas tout à fait ce que vous voulez dire. Voilà pourquoi représenterons-nous à une chaîne vide avant d'entrer dans la boucle :) –

+1

La solution ci-dessus accepte toujours les entrées telles que '22aa', 'aa 22' ou 'a23bb'. d la fin de la chaîne: tandis que [[! ($ nombre = ~^[0-9] + $)]]; faire –

8

Et pour éviter le moteur regex lourd, utiliser un simple glob:

if [[ ! $input || $input = *[^0-9]* ]]; then 
    echo "Error: '$input' is not a number." >&2 
fi 
+0

Oh, bonne idée. Je continue à oublier les installations de globbing de [[. J'ai trouvé qu'il accepte "" cependant. "$ input =" "|| $ input = * [^ 0-9] *" devrait le réparer. –

+0

Cela échoue en ce sens qu'il accepte une entrée vide. –

4

Permet l'espace avant et après le nombre, _33 ou 33___, mais pas 3__3. et pas de lettres. 0 ou

- Obtenir la contribution de l'utilisateur jusqu'à ce que correct

# -- get input until Correct 
    unset get_num 
    while [[ ! ${get_num} =~ ^[0-9]+$ ]]; do 
     echo "Please enter in a number:" 
     read get_num 
    done 
    echo This is a number : ${get_num} 

- Obtenir entrée jusqu'à ce que correcte (portée)

# -- get input until Correct (within range) 
    unset get_num 
    while [[ ! ${get_num} =~ ^[0-9]+$ ]]; do 
     echo "Please enter in a number within range of (1-30):" 
     read get_num 
     ! [[ ${get_num} -ge 1 && ${get_num} -le 30 ]] && unset get_num 
    done 
    echo This is a number withn a range : ${get_num} 

- obtenir l'entrée correcte jusqu'à ce que (portée) (manière complète regex)

« Depuis des expressions régulières traitent avec du texte plutôt que des chiffres, correspondant à un certain nombre dans une plage donnée prend un peu de soins. Vous ne pouvez simplement écrire [0-255 ] pour correspondre à un nombre entre 0 et 255. Bien qu'une regex valide, il correspond à quelque chose de complètement différent. [0-255] est une classe de caractères avec trois éléments: la plage de caractères 0-2, le caractère 5 et le caractère 5 (à nouveau). Cette classe de caractères correspond à un seul chiffre 0, 1, 2 ou 5, tout comme [0125] « ~ http://www.regular-expressions.info/numericranges.html

# -- get input until Correct (within range) (another way) 
    unset get_num 
    while [[ ! ${get_num} =~ ^([1-9]|1[0-9]|2[0-9]|30)$ ]]; do 
     echo "Please enter in a number within range of (1-30):" 
     read get_num 
    done 
    echo This is a number withn a range : ${get_num} 

-. Obtenez entrée et vérifier uniquement (pas en boucle)

# -- get input, and check it only (no while loop) 
    unset get_num 
    echo "Please enter in a number:" 
    read get_num 
    if [[ ! ${get_num} =~ ^[0-9]+$ ]] ;then 
     echo "${get_num} isn't a number" 
    else 
     echo "${get_num} is a number" 
    fi 
Questions connexes