2009-05-11 17 views
7

Escribí un script bash que toma números para el cálculo a través de la entrada del usuario. El problema que tengo es si el usuario escribe una letra o un espacio por error, todo el script falla y el usuario debe comenzar de nuevo.Bash: comprobar que la entrada del usuario es correcta

Debe haber una forma fácil de verificar que la entrada sea numérica solamente y que pregunte por la entrada nuevamente si se ingresa algo accidentalmente.

Respuesta

17

utilizar un bucle mientras

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

Sí que funciona, gracias, pero estoy reutilizando la misma variable así que la próxima vez tiene un valor de la última entrada. ¿Alguna idea? –

+0

No entiendo muy bien a qué te refieres. Es por eso que lo configuramos a una cadena vacía antes de ingresar al ciclo :) –

+1

La solución anterior aún acepta entradas como '22aa','aa 22 'o' a23bb '. La expresión regular debe incluir el inicio y d el final de la cadena: while [[! ($ number = ~^[0-9] + $)]]; do –

8

y para evitar que el motor de expresiones regulares pesados, utilice un pegote simple:

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

Oh, buena idea. Me sigo olvidando de las [['' instalaciones globbing ''. encontré que acepta "" sin embargo. "$ input =" "|| $ input = * [^ 0-9] *" debería arreglarlo. –

+0

Eso falla porque acepta entradas vacías. –

4

Permite espacio antes y después del número, _33, o 33___, pero no 3__3. y sin letras 0 o

- Obtener el aporte de usuario hasta que correcta

# -- 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} 

- Obtener entrada hasta que correcta (dentro del rango)

# -- 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} 

- obtener de entrada hasta que correcta (dentro del rango) (modo regex completo)

"Dado que las expresiones regulares se refieren al texto en lugar de a los números, la coincidencia de un número en un rango dado requiere un poco de cuidado adicional. No se puede simplemente escribir [0-255 ] para que coincida con un número entre 0 y 255. Aunque es una expresión regular válida, coincide con algo completamente diferente. [0-255] es una clase de personaje con tres elementos: el rango de caracteres 0-2, el personaje 5 y el personaje 5 (nuevamente). Esta clase de caracteres coincide con un solo dígito 0, 1, 2 ó 5, al igual que [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} 

-. Obtener el aporte, y comprobar que sólo (sin bucle while)

# -- 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 
Cuestiones relacionadas