<Anterior | Contenido | Siguiente>
Validación de entrada
Con nuestra nueva capacidad de tener entrada de teclado viene un desafío de programación adicional, validar la entrada. Muy a menudo, la diferencia entre un programa bien escrito y uno mal escrito radica en la capacidad del programa para hacer frente a lo inesperado. Con frecuencia, lo inesperado aparece en forma de entrada incorrecta. Hemos hecho un poco de esto con nuestros programas de evaluación en el capítulo anterior, donde verificamos los valores de los números enteros y filtramos
valores vacíos y caracteres no numéricos. Es importante realizar este tipo de comprobaciones de programación cada vez que un programa recibe una entrada, para protegerse contra datos no válidos. Esto es especialmente importante para los programas que comparten varios usuarios. Omitir estas salvaguardas en interés de la economía podría ser excusado si un programa va a ser usado una vez y solo por el autor para realizar alguna tarea especial. Incluso entonces, si el programa realiza tareas peligrosas como eliminar archivos, sería prudente incluir la validación de datos, por si acaso.
Aquí tenemos un programa de ejemplo que valida varios tipos de entrada:
#! / Bin / bash
# leer-validar: validar entrada invalid_input () {
echo "Entrada inválida '$ REPLY'"> & 2 salir 1
}
read -p "Ingrese un solo elemento>"
# entrada está vacía (inválida)
[[-z $ RESPUESTA]] && entrada_ inválida
# entrada es varios elementos (no válido)
(($ (echo $ RESPUESTA | wc -w)> 1)) && entrada_ inválida
# ¿La entrada es un nombre de archivo válido?
if [[$ RESPUESTA = ~ ^ [- [: alnum:] \ ._] + $]]; luego echo "'$ REPLY' es un nombre de archivo válido."
si [[-e $ RESPUESTA]]; luego
echo "Y el archivo '$ REPLY' existe".
más
echo "Sin embargo, el archivo '$ REPLY' no existe".
fi
# ¿Se ingresa un número de coma flotante?
if [[$ RESPUESTA = ~ ^ -? [[: dígito:]] * \. [[: dígito:]] + $]]; luego echo "'$ REPLY' es un número de coma flotante".
más
echo "'$ REPLY' no es un número de coma flotante."
fi
# ¿La entrada es un número entero?
if [[$ RESPUESTA = ~ ^ -? [[: dígito:]] + $]]; luego echo "'$ REPLY' es un número entero".
más
echo "'$ REPLY' no es un número entero."
#! / Bin / bash
# leer-validar: validar entrada invalid_input () {
echo "Entrada inválida '$ REPLY'"> & 2 salir 1
}
read -p "Ingrese un solo elemento>"
# entrada está vacía (inválida)
[[-z $ RESPUESTA]] && entrada_ inválida
# entrada es varios elementos (no válido)
(($ (echo $ RESPUESTA | wc -w)> 1)) && entrada_ inválida
# ¿La entrada es un nombre de archivo válido?
if [[$ RESPUESTA = ~ ^ [- [: alnum:] \ ._] + $]]; luego echo "'$ REPLY' es un nombre de archivo válido."
si [[-e $ RESPUESTA]]; luego
echo "Y el archivo '$ REPLY' existe".
más
echo "Sin embargo, el archivo '$ REPLY' no existe".
fi
# ¿Se ingresa un número de coma flotante?
if [[$ RESPUESTA = ~ ^ -? [[: dígito:]] * \. [[: dígito:]] + $]]; luego echo "'$ REPLY' es un número de coma flotante".
más
echo "'$ REPLY' no es un número de coma flotante."
fi
# ¿La entrada es un número entero?
if [[$ RESPUESTA = ~ ^ -? [[: dígito:]] + $]]; luego echo "'$ REPLY' es un número entero".
más
echo "'$ REPLY' no es un número entero."
Validación de entrada
fi más
echo "La cadena '$ REPLY' no es un nombre de archivo válido."
fi
fi más
echo "La cadena '$ REPLY' no es un nombre de archivo válido."
fi
Esta secuencia de comandos solicita al usuario que ingrese un elemento. Posteriormente se analiza el artículo para determinar su contenido. Como podemos ver, el script hace uso de muchos de los conceptos que hemos cubierto hasta ahora, incluidas las funciones de shell, [[]], (()), el operador de control
&&, y si, así como una buena dosis de expresiones regulares.