El artesano de los scripts

ShellBeginner
Practicar Ahora

Introducción

¡Bienvenido, futuro administrador de sistemas! Acaba de incorporarse como ingeniero Junior de DevOps a una empresa tecnológica muy activa. Su colega sénior está disfrutando de unas merecidas vacaciones y acaba de llegar a su mesa una tarea crítica. El servidor principal de la aplicación genera numerosos archivos de registro que consumen rápidamente el espacio en disco. Su misión, si decide aceptarla, es convertirse en El artesano de los scripts.

Debe crear un script de shell automatizado para gestionar estos archivos de registro. No se trata solo de ejecutar unos cuantos comandos, sino de crear una herramienta sólida y reutilizable. Comenzará con un script sencillo y añadirá progresivamente funciones como variables, entrada del usuario, comprobación de errores y bucles. Al finalizar este desafío, habrá creado un script capaz de realizar copias de seguridad y gestionar archivos, demostrando su valor al equipo y resolviendo la situación.

¡Comencemos a crear scripts!

Aviso importante
Este desafío abarca conocimientos que van más allá de Inicio rápido con Linux. Si todavía no ha aprendido estos temas, omita este desafío por ahora y continúe con Linux para principiantes, el siguiente curso de la ruta de aprendizaje de Linux.
Cuándo regresar:
  1. Complete el laboratorio guiado Fundamentos de scripting de shell y, después, regrese para volver a intentar este desafío.

Escribir un script de shell sencillo

Su primera tarea es establecer los cimientos. Todo gran script comienza con una sola línea. Debe crear el archivo del script y añadir un comando básico para comprobar que funciona correctamente. Este paso inicial confirma que la configuración es correcta y que está listo para crear una lógica más compleja.

Tareas

  • Cree un archivo de script de shell llamado log_manager.sh en el directorio ~/project.
  • Añada una línea «shebang» (#!/bin/bash) al principio del script. Esta línea indica al sistema qué intérprete debe utilizar.
  • Añada un comando para mostrar en pantalla el mensaje "Log Manager Initialized.".
  • Haga que el script sea ejecutable mediante el comando chmod +x.

Requisitos

  • El script debe llamarse log_manager.sh.
  • El script debe estar ubicado en el directorio ~/project.
  • La primera línea debe ser #!/bin/bash.
  • El script debe utilizar el comando echo para mostrar el mensaje requerido.
  • El script debe tener permisos de ejecución (utilice chmod +x log_manager.sh).

Ejemplos

Después de crear el script y hacerlo ejecutable, el proceso completo debería ser el siguiente:

Primero, compruebe que existe el archivo del script:

ls ~/project/
log_manager.sh

Establezca los permisos de ejecución del script:

chmod +x ~/project/log_manager.sh

Ahora ejecute el script:

./log_manager.sh

El script debería mostrar:

Log Manager Initialized.

También puede comprobar que el contenido del script es correcto:

cat ~/project/log_manager.sh

El archivo debe contener:

#!/bin/bash

echo "Log Manager Initialized."

Sugerencias

  • Puede utilizar un editor de texto de línea de comandos como nano para crear y editar el archivo. Por ejemplo: nano log_manager.sh.
  • El comando echo se utiliza para mostrar una línea de texto.
  • Utilice chmod +x filename para hacer que un script sea ejecutable. La opción +x añade permisos de ejecución para el propietario del archivo.

Añadir variables y entrada del usuario

Un script con valores escritos directamente en el código no es muy flexible. Para hacerlo más dinámico y reutilizable, ahora introducirá variables. Definirá una variable para el directorio de registros y solicitará al usuario una etiqueta para la ejecución de la copia de seguridad. Así, el script podrá adaptarse a distintas situaciones sin modificar el código.

Tareas

  • Modifique el script log_manager.sh.
  • Defina una variable llamada LOG_DIR y asígnele la ruta /home/labex/project/app_logs.
  • Añada una línea que muestre "Enter the backup filename: " para solicitar una entrada al usuario.
  • Utilice el comando read para guardar la entrada del usuario en una nueva variable llamada BACKUP_FILENAME.
  • Añada un comando echo final para confirmar la configuración y mostrar un mensaje como "Backing up logs to: [filename]", donde [filename] sea el valor introducido por el usuario.

Requisitos

  • El script debe contener una variable LOG_DIR establecida en /home/labex/project/app_logs.
  • El script debe utilizar el comando read para obtener la entrada del usuario.
  • La entrada del usuario debe guardarse en una variable llamada BACKUP_FILENAME.
  • La salida final debe utilizar la variable $BACKUP_FILENAME.

Ejemplos

Al ejecutar el script modificado, este debería solicitar una entrada y mostrar el mensaje de confirmación. La interacción debería ser similar a la siguiente:

./log_manager.sh
Log Manager Initialized.
Enter the backup filename: daily_backup
Backing up logs to: daily_backup

El script debe detenerse en el indicador "Enter the backup filename:", a la espera de que escriba un nombre y pulse Enter. Después de recibir la entrada, mostrará el mensaje de confirmación utilizando el valor introducido. En este desafío, ese valor es una etiqueta de ejecución que se muestra en la salida; la acción real de copia de seguridad se implementa en el paso 4 copiando archivos .log en ~/project/backups.

Sugerencias

  • Para definir una variable, utilice la sintaxis VARIABLE_NAME="value". No debe haber espacios alrededor del signo =.
  • Para utilizar el valor de una variable, escriba el signo $ delante de su nombre, como en $MY_VARIABLE.
  • El comando read pausa el script y espera a que escriba algo y pulse Enter.

Implementar lógica condicional

Un buen script se anticipa a los problemas. ¿Qué ocurre si no existe el directorio de registros que ha especificado? El script fallaría. Para hacerlo más sólido, debe añadir lógica condicional. Utilizará una instrucción if para comprobar que el directorio de registros existe antes de realizar cualquier operación.

Tareas

  • Modifique el script log_manager.sh.
  • Añada una instrucción if para comprobar si existe el directorio indicado por la variable $LOG_DIR.
  • Si el directorio existe, el script debe continuar como antes (solicitar el nombre del archivo, etc.).
  • Si el directorio no existe, el script debe mostrar el mensaje de error "Error: Log directory not found." y finalizar inmediatamente con un código de estado distinto de cero.

Requisitos

  • El script debe utilizar una instrucción if.
  • La condición debe comprobar la existencia de un directorio mediante el operador de prueba -d.
  • Si el directorio no existe, el script debe mostrar con echo el mensaje de error especificado.
  • Si el directorio no existe, el script debe finalizar mediante exit 1.

Ejemplos

Cuando existe el directorio de registros, el script debería ejecutarse con normalidad:

./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: test_backup.tar.gz
Backing up logs to: test_backup.tar.gz

Si el directorio de registros no existe, el script debería mostrar un error y finalizar:

./log_manager.sh
Log Manager Initialized.
Error: Log directory not found.

En este caso, el script finaliza inmediatamente después de mostrar el mensaje de error, sin solicitar una entrada al usuario ni continuar con operaciones de copia de seguridad.

Sugerencias

  • La sintaxis de una instrucción if básica es if [ condition ]; then ... else ... fi.
  • La prueba [ -d "$DIRECTORY_PATH" ] devuelve verdadero si $DIRECTORY_PATH existe y es un directorio.
  • exit 1 es una forma estándar de indicar que un script ha finalizado con un error.

Recorrer archivos para realizar operaciones

Ahora llega el núcleo de la automatización. Debe procesar los archivos del directorio de registros. Utilizará un bucle for para recorrer todos los archivos que terminen en .log dentro del directorio app_logs. En este desafío, simplemente los copiará en un nuevo directorio de copias de seguridad. La entrada BACKUP_FILENAME sigue siendo una etiqueta de ejecución que se muestra en la salida, no un archivo de archivo que el script cree.

Tareas

  • Primero, cree dentro de ~/project un directorio llamado backups, donde se copiarán los archivos de registro.
  • Modifique el script log_manager.sh.
  • Dentro del bloque if (donde se confirma que el directorio existe), añada un bucle for.
  • El bucle debe recorrer todos los archivos que terminen en .log dentro del directorio $LOG_DIR.
  • Dentro del bucle, utilice el comando cp para copiar cada archivo de registro en el directorio ~/project/backups.
  • Por cada archivo copiado, muestre un mensaje como "Copied [filename]".

Requisitos

  • Primero debe crear el directorio ~/project/backups desde la línea de comandos.
  • El script debe utilizar un bucle for.
  • El bucle debe recorrer los archivos de $LOG_DIR que coincidan con el patrón *.log.
  • El comando cp debe utilizarse dentro del bucle para copiar los archivos en ~/project/backups.
  • Una instrucción echo debe informar del nombre de cada archivo a medida que se copia.

Ejemplos

Después de completar este paso, al ejecutar el script con un nombre de archivo de copia de seguridad, debería procesar todos los archivos de registro y mostrar una salida similar a la siguiente:

./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: daily_backup
Backing up logs to: daily_backup
Copied /home/labex/project/app_logs/access.log
Copied /home/labex/project/app_logs/debug.log
Copied /home/labex/project/app_logs/error.log
Backup complete.

El script debe recorrer cada archivo .log del directorio y mostrar un mensaje "Copied" por cada archivo. Los nombres exactos dependerán de los archivos de registro presentes en el directorio app_logs.

Cuando el script termine, puede comprobar que los archivos se copiaron revisando el directorio backups:

ls ~/project/backups/
access.log  debug.log  error.log

Sugerencias

  • Puede crear un directorio mediante el comando mkdir.
  • Un bucle for para archivos puede escribirse como for file in /path/to/*.log; do ... done.
  • La sintaxis del comando cp es cp <source> <destination>.
  • En cada iteración, la variable del bucle (por ejemplo, file) contendrá la ruta completa del archivo.

Resumen

¡Enhorabuena, artesano de los scripts! Ha creado correctamente un script de shell completo y funcional desde cero. Se enfrentó a un problema real —gestionar archivos de registro— y lo resolvió mediante la automatización.

En este desafío, ha aprendido varios conceptos fundamentales del scripting de shell:

  • Crear y estructurar un script con una línea shebang.
  • Utilizar variables para hacer que el script sea dinámico.
  • Capturar la entrada del usuario con read.
  • Implementar una comprobación sólida de errores mediante instrucciones if.
  • Automatizar tareas repetitivas con bucles for.
  • Gestionar permisos de archivos y ejecutar el script.

Ahora su script puede comprobar automáticamente si existen los directorios de registros, procesar todos los archivos de registro y copiarlos en una ubicación de copia de seguridad. Este es un gran paso en su trayectoria como ingeniero de DevOps o administrador de sistemas. Las habilidades que ha practicado son la base para escribir scripts de automatización mucho más complejos, capaces de gestionar servidores, implementar aplicaciones y procesar datos. Ha demostrado que puede asumir responsabilidades y entregar una solución funcional. ¡Excelente trabajo!

✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar