Crear scripts interactivos en Bash es clave para automatizar tareas que dependen de datos del usuario con precisión y rapidez. Aquí verás, paso a paso, cómo solicitar y almacenar entradas usando dos enfoques: combinar echo + read con la variable especial REPLY y usar solo read asignando directamente a variables. Así podrás construir utilidades confiables, como un pequeño asistente para backups en Postgres.
¿Cómo capturar información del usuario en Bash de forma efectiva?
La interacción se entiende mejor con tres actores: el usuario, los datos ingresados y el procesamiento. El objetivo es pedir una opción y un nombre de archivo de backup, almacenar ambos y mostrarlos para verificar.
Scripts interactivos: lectura de entradas para validar o ejecutar procesos específicos.
Variables clave: option y backupname para guardar datos del usuario.
Comandos básicos: echo, read, y la variable especial REPLY.
Flujo típico: mostrar un mensaje, leer la entrada, almacenar y luego imprimir.
¿Qué hace la variable REPLY en Bash?
La variable REPLY almacena el último valor leído por read cuando no se indica una variable destino. Es práctica para pruebas rápidas, pero puede ser menos clara si lees múltiples entradas seguidas, porque se sobrescribe cada vez.
Ejemplo 1: combinación de echo + read usando REPLY.
#!/usr/bin/env bash# Programa: capturar información con echo, read y REPLYoption=0backupname=""# Pedir opciónecho"Ingrese una opción:"readoption="$REPLY"# Pedir nombre del archivo de backupecho"Ingrese el nombre del archivo del backup:"readbackupname="$REPLY"# Mostrar resultadosecho"Opción: $option"echo"Backup name: $backupname"
Puntos clave:
Lecturas consecutivas sobrescriben REPLY. Guarda su contenido en variables propias inmediatamente.
Útil para scripts simples; puede volverse confuso en flujos largos.
¿Qué ventajas ofrece usar solo read con variables destino?
Leer y asignar directamente a variables con read mejora la claridad. Además, el flag -p permite mostrar el prompt directamente sin echo. En el material se menciona también el uso de -t junto a read.
Ejemplo 2: uso directo de read con variables.
#!/usr/bin/env bash# Programa: capturar información solo con readoption=0backupname=""read -p "Ingrese una opción: " option
read -p "Ingrese el nombre del archivo del backup: " backupname
echo"Opción: $option"echo"Backup name: $backupname"
Ventajas:
Menos pasos: no necesitas echo ni REPLY.
Mayor legibilidad: cada dato tiene su variable desde la lectura.
Escalable: ideal cuando pides varios valores.
¿Cómo pedir múltiples datos sin perder claridad?
Usa un prompt claro con read -p para cada dato.
Asigna a variables con nombres descriptivos: option, backupname.
Muestra al final un resumen de lo ingresado para validar.
¿Qué habilidades y buenas prácticas refuerza este ejercicio?
Comprender estos comandos y patrones te ayudará a diseñar mejores utilidades en Ubuntu y entornos similares.
Diseño de interacción: pensar en usuario, datos y procesamiento.
Variables en Bash: inicialización, asignación tras cada read y uso seguro.
Mensajería clara: prompts directos que indican qué ingresar.
Ejecución: dar permisos y correr con ./script.sh.
Además, se trabajó con conceptos como:
Script interactivo: solicita datos para tomar decisiones o ejecutar acciones.
Impresión de resultados: confirma lo ingresado para evitar errores.
Edición y guardado: edición del archivo y salida con :wq al terminar.
¿Tienes dudas o un caso de uso que quieras resolver con read? Cuéntalo y pensamos juntos la mejor forma de pedir y validar tus datos.
-p: Permite ingresar una frase o prompt antes de pedir el dato.
-s: Modo Sigiloso. No muestra ningún caracter en la terminal, util para contraseñas o información sensible.
-n [num]: Permite leer como máximo n caracteres.
-r: Toma el botón de retroceso o backspace como un caracter y no borra ningun otro caracter previamente escrito.
Muchas gracias hermano, me ahorraste como 5 segundos de busqueda en Google
Listo, muy importante revisar la primera línea, ya que en mi caso, si no está totalmente unida no funciona correctamente el bash
#!/bin/bash
6
#!/bin/bash# Bash para captura la informacion del usuario utilizando echo read
option=0backupName=""echo "Programa Utilidades Postgres"echo -n "Ingresar una opcion:"read
option=$REPLYecho -n "Ingresa el nombre del archivo de Backup:"read
backupName=$REPLYecho "La opcion selecionada fue : $option y el nombre del Backup es: $backupName"
7
#!/bin/bash# Bash para captura la informacion del usuario utilizando read
option=0backupName=""contrasena=""echo "Programa Utilidades Postgres"read -p "Ingresar una opcion:" option
read -p "Ingresa el nombre del archivo de Backup:" backupName
read -s -p "Ingresa contraseña:" contrasena
echo "La opcion selecionada fue : $option El nombre del Backup es: $backupName La contraeña es: $contrasena "
Una alternativa de borrado en vim salir del modo insert y hacer shift+d esto tomara el cursor como punto de origen y borrara todo el texto que encuentre hasta el final de la linea
option=0backupName=""echo "Utilidades PostGres"echo -n "Ingresar una opcion:"read REPLYoption=$REPLYecho -n "Ingresa el nombre del archivo del backup:"read REPLYbackupName=$REPLYecho "Opcion: $option , backupName: $backupName "
Excelente aporte Kevin, de hecho tambien utilizo zsh y yo lo resolví agregando REPLY al read
option=0backupName=""echo "Utilidades PostGres"echo -n "Ingresar una opcion:"read REPLYoption=$REPLYecho -n "Ingresa el nombre del archivo del backup:"read REPLYbackupName=$REPLYecho "Opcion: $option , backupName: $backupName "
read: Lee una línea de la salida estándar y la divide en campos.
Si no se proporciona ningún NOMBRE, la línea leída se guarda en la
variable REPLY.Opciones:**-a** matriz asigna las palabras leídas a índices secuenciales de
la variable matricial MATRIZ, empezando en cero
**-d** delim continúa hasta que se lea el primer carácter de DELIM, en lugar de línea nueva
**-e** usa Readline para obtener la línea
**-i** texto Emplea el TEXTO como el texto inicial para Readline**-n** ncars regresa tras leer NCARS caracteres en lugar de
esperar una línea nueva, pero honra a un delimitador si
se leen menos de NCARS caracteres antes del delimitador
**-N** ncars devuelve sólo después de leer exactamente NCARS caracteres, a menos que se encuentre el fin del fichero
o expire la lectura, descartando cualquier delimitador
_-p _prompt sale la cadena PROMPT sin un carácter de línea nueva
al final antes de intentar leer
**-r ** no permite que las barras invertidas escapen caracteres
**-s ** no muestra la salida que proviene de una terminal
**-t** tiempo expira y devuelve fallo si no se lee una línea completa
de entrada en TIEMPO segundos.El valor de la variable TMOUT es el tiempo de expiración por defecto.TIEMPO puede ser un
número fraccionario.SiTIEMPO es 0, ‘read’ devuelve correcto
sólo si hay entrada disponible en el descriptor de fichero
especificado.El estado de salida es mayor que 128 si se excede
el tiempo de expiración.**-u **df lee del descriptor de fichero DF en lugar de la entrada
estándar
Tengo ubuntu en win10, pero algun cambio que ejecute antes no me permite que este script funcione bien, es como que no toma el comando -n y no espera para poner los datos, simplemente ejecuto y lanza todo el texto, no me deja ingresar parametros.
hice el mismo script en maquina virtual y me funciona bien.
La pregunta es ¿Como reparo el ubuntu integrado en windows. ? o que opciones cambio para que se comporte como quiere el script
Generalmente cando de elabora un programa o se hace un script, generalmente no siempre eso se hace de manera automáticamente, muchas de las veces requiere información o ser retro alimentada por información que el usuario ingresa y en base a esta se hace algunos procesos, por lo cual se conoce como capturar información del usuario.
¿ Cómo capturar la información del usuario?
Se utiliza el comando read de dos maneras:
Utilizando en conjunto con el comando echo.
Utilizando directamente el comando read.
( usuario --> información --> programa )
para quienes les da error en zsh, puede simplificarse de esta manera (el comando $REPLY estaria implicito en "read"), tambien funciona eliminando "-n"
echo "Programa utilidades postgres"echo "Ingresar una opcion:"read option
echo "Ingresar el nombre del archivo del backup:"read backupName
echo "opcion:$option, backupName:$backupName"
Para leer contraseñas, se puede utilizar el parámetro -s de read. Sin embargo, es mejor hacer un script POSIX compliant, de esta forma nuestro script correrá sin problemas en el shell de cualquier sistema UNIX.
Si tienes zsh poner la opcion -p te va a causar un error "no coprocess". Y es porque en zsh la sintaxis de read es un poco diferente y tendría que ser por ejemplo:
read "option?Ingresa una opcion:"echo "$option"```
para limitar el numero de caracteres se usa -k en lugar de -n para bash, y -s sirve para lo mismo.Aquí hay más información al respecto https://zsh.sourceforge.io/Doc/Release/Shell-Builtin-Commands.html