El artesano de los scripts

ShellBeginner
Practicar Ahora

Introducción

¡Te damos la bienvenida, futuro administrador de sistemas! Acabas de incorporarte a una empresa tecnológica muy activa como ingeniero júnior de DevOps. Tu compañero sénior está disfrutando de unas merecidas vacaciones y acaba de llegar a tu mesa una tarea crítica. El servidor principal de aplicaciones está generando numerosos archivos de registro que consumen rápidamente el espacio del disco. Tu misión, si decides aceptarla, es convertirte en el artesano de los scripts.

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

¡Manos a la obra con los scripts!

Aviso importante
Es posible que los próximos desafíos superen el alcance del curso Primeros pasos rápidos con Linux.
Si encuentras dificultades durante el desafío:
  1. Omite temporalmente el desafío y continúa con los siguientes laboratorios guiados de la ruta de aprendizaje de Linux.
  2. Consulta tus dudas con Labby o revisa la solución.

Escribir un script de shell sencillo

Tu primera tarea es sentar las bases. Todo gran script comienza con una sola línea. Debes 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ás preparado para crear una lógica más compleja.

Tareas

  • Crea un nuevo archivo de script de shell llamado log_manager.sh en el directorio ~/project.
  • Añade una línea «shebang» (#!/bin/bash) al principio del script. Esto indica al sistema qué intérprete debe utilizar.
  • Añade un comando que muestre en pantalla el mensaje "Log Manager Initialized.".
  • Haz 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 indicado.
  • El script debe tener permisos de ejecución (utiliza chmod +x log_manager.sh).

Ejemplos

Después de crear el script y concederle permisos de ejecución, el proceso completo debería ser el siguiente:

Primero, comprueba que existe el archivo del script:

ls ~/project/
log_manager.sh

Concede permisos de ejecución al script:

chmod +x ~/project/log_manager.sh

Ahora ejecuta el script:

./log_manager.sh

El script debería mostrar:

Log Manager Initialized.

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

cat ~/project/log_manager.sh

El archivo debería contener:

#!/bin/bash

echo "Log Manager Initialized."

Pistas

  • Puedes 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.
  • Utiliza chmod +x filename para hacer que un script sea ejecutable. +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ás variables. Definirás una variable para el directorio de registros y pedirás al usuario una etiqueta para la ejecución de la copia de seguridad. Así, el script podrá adaptarse a distintas situaciones sin tener que modificar el código.

Tareas

  • Modifica el script log_manager.sh.
  • Define una variable llamada LOG_DIR y asígnale la ruta /home/labex/project/app_logs.
  • Añade una línea que muestre "Enter the backup filename: " para solicitar una entrada al usuario.
  • Utiliza el comando read para guardar la entrada del usuario en una nueva variable llamada BACKUP_FILENAME.
  • Añade 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 con el valor /home/labex/project/app_logs.
  • El script debe utilizar el comando read para obtener una entrada del usuario.
  • La entrada del usuario debe almacenarse 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 la solicitud "Enter the backup filename:", esperando a que el usuario 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, dicho valor es una etiqueta de ejecución que aparece en la salida; la copia real se implementa en el paso 4 copiando los archivos .log en ~/project/backups.

Pistas

  • Para definir una variable, utiliza la sintaxis VARIABLE_NAME="value". No debe haber espacios alrededor del signo =.
  • Para utilizar el valor de una variable, antepone un signo $ a su nombre, como en $MY_VARIABLE.
  • El comando read pausa el script y espera a que el usuario 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 especificado? El script fallaría. Para hacerlo más robusto, debes añadir lógica condicional. Utilizarás una instrucción if para comprobar que el directorio existe antes de intentar realizar cualquier operación.

Tareas

  • Modifica el script log_manager.sh.
  • Añade 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 salida 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 indicado.
  • Si el directorio no existe, el script debe finalizar mediante exit 1.

Ejemplos

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

./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 la entrada del usuario ni continuar con operaciones de copia de seguridad.

Pistas

  • 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 habitual de indicar que un script ha finalizado debido a un error.

Recorrer archivos para realizar operaciones

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

Tareas

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

Requisitos

  • Primero debes 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.
  • Debe utilizarse el comando cp dentro del bucle para copiar los archivos a ~/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 copia de seguridad, debería procesar todos los archivos de registro y mostrar una salida similar a esta:

./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, puedes comprobar que los archivos se copiaron correctamente consultando el directorio backups:

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

Pistas

  • Puedes 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>.
  • La variable del bucle (por ejemplo, file) contendrá la ruta completa del archivo en cada iteración.

Resumen

¡Enhorabuena, artesano de los scripts! Has creado desde cero un script de shell completo y funcional. Te enfrentaste a un problema del mundo real —la gestión de archivos de registro— y lo resolviste mediante la automatización.

En este desafío has aprendido varios conceptos fundamentales de los scripts de shell:

  • Crear y estructurar un script mediante 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 tu script puede comprobar automáticamente la existencia de directorios de registros, procesar todos los archivos de registro y copiarlos a una ubicación de copia de seguridad. Este es un gran paso en tu trayectoria como ingeniero de DevOps o administrador de sistemas. Las habilidades que has practicado aquí son la base para crear scripts de automatización mucho más complejos, capaces de gestionar servidores, desplegar aplicaciones y procesar datos. Has demostrado que puedes 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