Introducción
Imagine que tiene un robot camarero. Un robot estático solo puede decir «Hola, señor» a todo el mundo. Un robot dinámico puede preguntarle su nombre y decir «Hola, Sarah» o «Hola, Mike».
En el laboratorio anterior, su script siempre hacía exactamente lo mismo. En este laboratorio hará que sea dinámico, permitiendo que los datos provengan del exterior del propio script.
Este es un cambio importante en programación. Cuando un script puede aceptar entradas, deja de ser una demostración fija y se convierte en una herramienta reutilizable.
Aprenderá dos formas de comunicarse con su script:
- Preguntar y escuchar: el script se detiene y le hace una pregunta mediante
read. - Pasar una nota: entrega una nota al script justo cuando lo inicia mediante argumentos.
Al finalizar este laboratorio, su código podrá saludar a cualquier persona que usted quiera, no solo a «World».
Usar read para la entrada interactiva
Nuestro primer método es el enfoque «conversacional». Haremos que el script muestre una pregunta y espere una respuesta.
Usaremos el comando read. Piense en read como un comando que dice: «Deténgalo todo, abra bien los oídos y espere a que el usuario escriba algo».
Este es su primer ejemplo de un script que recibe datos mientras ya está en ejecución. En los scripts de shell, una variable es un espacio con nombre donde se almacenan temporalmente datos, como un nombre de usuario, un nombre de archivo o un número. Las variables hacen que los scripts sean reutilizables, porque permiten trabajar con entradas cambiantes en lugar de usar texto codificado directamente.
Primero, asegúrese de encontrarse en el espacio de trabajo del proyecto:
cd ~/project
Cree un archivo nuevo llamado hello.sh con nano:
nano hello.sh
Escriba el código siguiente.
Nota: Definimos una «caja» (variable) llamada name para almacenar la respuesta del usuario.
#!/bin/bash
echo "What is your name?"
read name
echo "Hello, $name!"
Analicemos el código:
echo "...": el script le habla.read name: el script escucha. Todo lo que escriba se guarda dentro de la cajaname.$name: el script abre la caja. El símbolo$es la clave que permite acceder a la variable y ver qué contiene.
Observe la diferencia entre name y $name. name es la etiqueta de la variable cuando la crea o le asigna un valor. $name significa «sustituya esto por el valor almacenado dentro de la variable». Esta sustitución se denomina expansión y es uno de los comportamientos más importantes del shell.
Guarde el trabajo (Ctrl+O, Enter) y salga (Ctrl+X).
Ejecutar el script interactivo
Antes de poder conversar con el script, debemos autorizarlo para que se ejecute. ¿Recuerda la «llave» del laboratorio anterior?
Conceda permiso de ejecución:
chmod +x hello.sh
Ahora vamos a conversar. Ejecute el script:
./hello.sh
El script preguntará «What is your name?» y después se detendrá. Estará esperando su respuesta. Es posible que el cursor parpadee.
Escriba su nombre, por ejemplo, Alice, y pulse Enter.
What is your name?
Alice
Hello, Alice!
Esto se denomina entrada interactiva. Es muy útil para herramientas que utilizan las personas, pero no es adecuada para la automatización. Imagine intentar ejecutar este script automáticamente a las 3 de la madrugada. Se quedaría detenido esperando una respuesta que nunca llegaría.
Esta diferencia es importante en las operaciones reales. Los scripts interactivos son prácticos cuando hay una persona presente, pero los trabajos programados, las canalizaciones de CI y los scripts de inicio normalmente necesitan entradas no interactivas para poder ejecutarse sin supervisión.
Usar argumentos para la entrada no interactiva
Para que nuestro script sea adecuado para la automatización, necesitamos una forma de proporcionarle los datos antes de que comience a ejecutarse, de modo que nunca tenga que detenerse. Para ello usaremos argumentos.
Piense en los argumentos como un «buzón» en una puerta. Introduce el mensaje al pasar.
En Bash, estos buzones tienen nombres numéricos:
$1es la primera palabra que escribe después del nombre del script.$2es la segunda palabra, y así sucesivamente.
Estos valores numéricos se denominan parámetros posicionales. El shell los crea automáticamente cuando se inicia el script. Usted no define $1; Bash lo rellena a partir de la línea de comandos que inició el script.
Vamos a actualizar hello.sh para que busque el valor en el primer buzón, $1, en lugar de hacer una pregunta.
Abra el archivo:
nano hello.sh
Cambie el código para que tenga este aspecto:
#!/bin/bash
name=$1
echo "Hello, $name!"
Aquí, name=$1 toma lo que encuentre en el buzón $1 y lo coloca en la caja name. No hay pausas ni preguntas.
Guarde el archivo y salga.
Ejecutar el script con argumentos
Ahora ejecutará el script de otra manera. Simplemente «lanzará» el nombre al script cuando lo inicie.
Ejecute este comando:
./hello.sh LabEx
Aquí, LabEx es el argumento. El script lo obtiene como $1 y muestra inmediatamente:
Hello, LabEx!
Pruébelo con otro nombre:
./hello.sh World
Funciona al instante. Sin pausas.
El problema del buzón vacío
¿Qué ocurre si no proporciona ningún argumento?
./hello.sh
Obtendrá:
Hello, !
El buzón $1 estaba vacío, por lo que la caja name también estaba vacía. En laboratorios posteriores aprenderá a detectar esta situación y mostrar un mensaje de error, pero por ahora ya ha creado correctamente un script optimizado y listo para la automatización.
Esta diferencia entre la entrada interactiva y los argumentos de la línea de comandos es fundamental. read pregunta durante la ejecución, mientras que $1 está disponible desde el principio. Muchas herramientas de Unix están diseñadas para trabajar con argumentos porque son más fáciles de automatizar, documentar, repetir y combinar con otros comandos.
Resumen
¡Enhorabuena! Ha aprendido el arte de escuchar.
En este laboratorio exploró:
- Modo interactivo: usar
readpara conversar con el usuario, una opción adecuada para las personas. - Modo de argumentos: usar
$1para aceptar datos al iniciar el script, una opción adecuada para robots y procesos automatizados.
También aprendió que las variables, como $name, son simplemente cajas etiquetadas donde los scripts almacenan información. Este concepto es la base de toda la programación.



