Introducción
En la automatización de tareas mediante scripts de shell, es frecuente necesitar interactuar con el usuario para solicitar datos, confirmar acciones o recibir configuraciones específicas. El comando read de Bash permite capturar la entrada estándar desde el teclado y almacenarla en variables, lo que convierte a los scripts en herramientas mucho más flexibles y amigables. En este artículo exploraremos su sintaxis, las opciones más útiles y varios ejemplos prácticos que podrás aplicar inmediatamente en tus propios scripts.
Sintaxis básica
La forma más simple de read es: read variable. Este comando pausa la ejecución del script y espera que el usuario teclee una línea de texto, finalizando con la tecla Enter. Lo ingresado se guarda en la variable indicada. Si no se especifica ninguna variable, el contenido se almacena en la variable especial REPLY. Además, read admite varios flags que modifican su comportamiento, como -p para mostrar un prompt, -s para ocultar la entrada (útil para contraseñas), -t para establecer un tiempo de espera, -n para limitar el número de caracteres, -r para evitar que la barra invertida actúe como carácter de escape y -a para leer directamente en un array.
Opciones más utilizadas
- -p ‘texto’: muestra el texto como mensaje de petición antes de leer la entrada.
- -s: modo silencioso, no muestra lo que el usuario teclea (ideal para contraseñas).
- -t segundos: establece un tiempo de espera; si se supera, read termina con código de error.
- -n número: limita la lectura a ese número de caracteres; después de alcanzarlos, read regresa automáticamente.
- -r: barra invertida no actúa como carácter de escape, se lee literalmente.
- -a nombre_array: guarda cada palabra leída en un elemento del array indicado.
Ejemplos prácticos
Lectura simple con prompt
#!/bin/bash read -p 'Introduce tu nombre: ' nombre echo Hola, $nombre!
Lectura de contraseña
#!/bin/bash read -s -p 'Introduce tu contraseña: ' password echo echo 'Contraseña guardada (en un caso real se tendría que hash).'
Lectura con tiempo de espera
#!/bin/bash
if read -t 5 -p '¿Continuar? (s/n): ' respuesta; then
echo Respuesta: $respuesta
else
echo Tiempo agotado, se asume 'n'.
respuesta=n
fi
Lectura en un array
#!/bin/bash
read -a frutas -p 'Introduce tres frutas separadas por espacios: '
echo Has elegido: ${frutas[0]}, ${frutas[1]} y ${frutas[2]}
Procesar un archivo línea por línea
#!/bin/bash
while IFS= read -r linea; do
echo Línea leída: $linea
done < archivo.txt
Manejo de errores y validación
Es importante comprobar el código de salida de read para detectar situaciones como tiempo de espera agotado o interrupción mediante Ctrl+D. El variable especial $? contiene el estado del último comando; un valor distinto de cero indica un fallo. Además, después de leer se puede validar el contenido usando expresiones regulares o comparaciones simples:
- if [[ -z $variable ]]; then echo ‘Entrada vacía’; fi
- if ! [[ $variable =~ ^[0-9]+$ ]]; then echo ‘No es un número’; fi
Combinar la opción -t con una prueba de $? permite ofrecer un valor predeterminado cuando el usuario no responde a tiempo.
Buenas prácticas
- Siempre usar -r a menos que necesites que la barra invertida funcione como escape.
- Encerrar las variables en comillas dobles al usarlas para evitar problemas con espacios o caracteres especiales.
- Cuando solicites información sensible, combina -s con -p y, después de usar el dato, borra la variable si no es necesario conservarla (unset variable).
- Para lecturas que provienen de archivos, combina IFS= y -r para preservar espacios iniciales y finales.
- Documenta el propósito de cada read dentro del script con comentarios claros.
Conclusión
El comando read es una herramienta esencial para crear scripts interactivos y adaptables en Linux. Dominar su sintaxis y sus opciones te permite solicitar datos de forma segura, controlar tiempos de espera, almacenar entradas en arrays y manejar adecuadamente los errores. Aplicando las buenas prácticas descritas, tus scripts serán más profesionales, seguros y fáciles de usar tanto para ti como para otros usuarios.