Unidad 6: Scripting y automatización de tareas en Bash

Introducción a la programación en Shell

Un script de Bash es un archivo de texto plano que contiene una secuencia de comandos que la terminal ejecuta de forma automática. En bioinformática, los scripts son esenciales para construir pipelines o flujos de trabajo reproducibles, permitiendo procesar múltiples archivos o muestras de forma ordenada, consistente y eficiente.

Al utilizar scripts, es posible:

  • evitar repetir manualmente los mismos comandos,
  • reducir errores en el análisis,
  • documentar mejor los pasos realizados,
  • automatizar tareas frecuentes.

El shebang

Todo script de Bash debe iniciar con una línea llamada shebang. Esta línea le indica al sistema qué intérprete debe usar para ejecutar el archivo.

#!/bin/bash

Mi primer script: Hola Mundo

Crear el archivo:

nano hola.sh

Escribir el siguiente contenido:

#!/bin/bash
echo "Hola Mundo"

Guardar el archivo, otorgar permisos de ejecución y ejecutarlo:

chmod +x hola.sh
./hola.sh

Estructura básica de un script

Un script puede contener comandos, comentarios, variables y estructuras más complejas. Su estructura básica suele incluir:

  • shebang al inicio,

  • comentarios con #

  • comandos en líneas separadas,

  • permisos de ejecución.

Ejemplo básico

#!/bin/bash

# Este es un comentario
echo "Iniciando análisis"
date
echo "Análisis terminado"

Comentarios

Los comentarios sirven para documentar qué hace cada parte del script.

# Este script imprime la fecha actual
date

Permisos y ejecución

Para ejecutar un script directamente:

chmod +x script.sh
./script.sh

También puede ejecutarse así:

bash script.sh

Variables y argumentos

Las variables permiten guardar información que puede reutilizarse más adelante en el script.

Variables

#!/bin/bash

muestra="sample_01"
echo "Procesando la muestra: $muestra"

Reglas básicas

  • no debe haber espacios alrededor de =,

  • se accede al valor con $nombre_variable.

Argumentos posicionales

Los scripts también pueden recibir información desde la línea de comandos.

#!/bin/bash
echo "El primer argumento es: $1"

Ejecutar:

./script.sh archivo1.fastq

Resultado esperado:

El primer argumento es: archivo1.fastq

Algunos argumentos útiles

  • $1, $2, $3: primer, segundo y tercer argumento

  • $#: número total de argumentos

  • $@: todos los argumentos

Ejemplo:

#!/bin/bash
echo "Número de argumentos: $#"
echo "Lista completa: $@"

Entrada, salida y mensajes en scripts

Los scripts pueden mostrar información en pantalla, guardar resultados en archivos o solicitar datos al usuario.

Mostrar mensajes con echo

echo "Iniciando proceso..."

Guardar salida en un archivo

echo "Resultado del análisis" > salida.txt

Agregar contenido sin sobrescribir

echo "Nueva línea" >> salida.txt

Leer datos del usuario

#!/bin/bash
echo "Escribe el nombre de la muestra:"
read muestra
echo "La muestra ingresada es: $muestra"

Guardar un log sencillo

#!/bin/bash
echo "Inicio: $(date)" >> log.txt
echo "Ejecutando análisis..." >> log.txt
echo "Fin: $(date)" >> log.txt

Estructuras de control

Las estructuras de control permiten que un script tome decisiones según ciertas condiciones. Son útiles para verificar si un archivo existe, si un directorio ya fue creado o si un proceso terminó correctamente.

if, elif y else

#!/bin/bash

archivo="datos.fastq"

if [ -f "$archivo" ]; then
    echo "El archivo existe"
else
    echo "El archivo no existe"
fi

Ejemplo con varias condiciones

#!/bin/bash

numero=10

if [ "$numero" -gt 10 ]; then
    echo "El número es mayor que 10"
elif [ "$numero" -eq 10 ]; then
    echo "El número es igual a 10"
else
    echo "El número es menor que 10"
fi

Algunas pruebas comunes

  • -f : existe un archivo

  • -d : existe un directorio

  • -e : existe archivo o directorio

  • -z : cadena vacía

  • -n : cadena no vacía

  • -eq : igual

  • -ne : diferente

  • -lt : menor que

  • -gt : mayor que

Bucle for

En Bash, el bucle for se usa para repetir una acción varias veces.
Es muy útil cuando se quiere aplicar el mismo comando a:

  • varios archivos,

  • varias muestras,

  • varias carpetas,

  • una lista de nombres,

  • una serie de números.

Idea central

En lugar de escribir muchas veces el mismo comando:

echo "Procesando muestra1.fastq.gz"
echo "Procesando muestra2.fastq.gz"
echo "Procesando muestra3.fastq.gz"

podemos usar for

Sintaxis general

for variable in lista; do
    comandos
done

Explicación

  • for inicia el bucle

  • variable guarda temporalmente cada elemento

  • in lista indica qué elementos se van a recorrer

  • do marca el inicio de los comandos a repetir

  • done marca el final del bucle

Primer ejemplo sencillo:

for nombre in Ana Luis Carmen; do
    echo "Hola, $nombre"
done

El bucle hace esto internamente:

  • primero nombre="Ana"

  • luego nombre="Luis"

  • luego nombre="Carmen"

Y en cada vuelta ejecuta:

echo "Hola, $nombre"

Ejemplo con números

for n in 1 2 3 4 5; do
    echo "Número: $n"
done

Ejercicio: uso de for en Bash

Escribe un script en Bash que realice lo siguiente:

  1. Muestre en pantalla los números del 1 al 100.

  2. Después, muestre en pantalla los números del 2 al 100 avanzando de 2 en 2.

  3. Recorre las muestras de la carpeta /home/cristian/mi_proyecto/data/raw que terminan en .fq.gz y muestra para cada una el mensaje Procesando <nombre_de_la_muestra> usando la variable muestra.

Bucle while

El bucle while ejecuta un bloque de comandos mientras una condición sea verdadera.

Su idea es:

“repite esto mientras se cumpla esta condición”.

while condicion; do
    comandos
done

Cómo funciona while

contador=1

while [ $contador -le 3 ]; do
    echo "Iteración $contador"
    contador=$((contador + 1))
done

Paso a paso

  1. contador=1

  2. Bash evalúa la condición:

[ $contador -le 3 ]
  1. Como 1 <= 3, entra al bucle.

  2. Ejecuta:

echo "Iteración 1"
  1. Luego aumenta el contador:echo “Iteración 1”
contador=$((contador + 1))
  1. Vuelve a evaluar la condición.

  2. Cuando contador ya no cumple, el bucle termina.

Comando read

read toma una línea y la guarda en variable.

read variable

Ejemplo interactivo:

#!/bin/bash
read -p "Escribe tu nombre: " nombre
echo "Hola, $nombre"

Aquí:

  • -p muestra un mensaje,

  • lo que el usuario escriba se guarda en nombre.

Leer un archivo línea por línea usando read y while

while read linea; do
    echo "$linea"
done < archivo.txt
  • read linea toma una línea

  • while repite eso hasta llegar al final del archivo

  • done < archivo.txt hace que la entrada venga del archivo y no del teclado

Ejercicio:

Instrucciones

  1. Crear un archivo llamado nombres.txt.

  2. Escribir dentro 10 nombres, uno por línea.

  3. Crear un script en Bash que lea el archivo con while.

  4. El script debe contar cuántas líneas tiene el archivo.

  5. Al final debe imprimir el total de nombres leídos.

Ejemplo de archivo nombres.txt

Ana
Luis
María
Carlos
Elena
José
Fernanda
Miguel
Laura
Diego

Tarea:

  1. Crear un script llamado contar_lecturas.sh.

  2. El script debe recibir el nombre del archivo como argumento.

  3. Debe detectar si el archivo está comprimido (.gz) o no.

  4. Debe contar cuántas lecturas hay en el archivo.

  5. Debe imprimir el nombre del archivo y el número total de lecturas.

Funciones en Bash

Las funciones permiten agrupar comandos que se reutilizan dentro de un script. Ayudan a organizar mejor el código y facilitan su lectura.

Ejemplo de función

#!/bin/bash

saludar() {
    echo "Hola, bienvenido al análisis bioinformático"
}

saludar

Función con argumento

#!/bin/bash

procesar_muestra() {
    echo "Procesando la muestra: $1"
}

procesar_muestra "sample_01"

Automatización de scripts con cron

Además de ejecutarse manualmente, los scripts pueden programarse para correr de manera automática con cron.

cron es un sistema de Linux que permite ejecutar tareas en horarios definidos, por ejemplo:

  • cada día,

  • cada semana,

  • cada cierto número de minutos,

  • en fechas específicas.

¿Para qué sirve en bioinformática?

Algunos usos comunes son:

  • respaldos automáticos,

  • monitoreo de recursos,

  • limpieza de archivos temporales,

  • ejecución periódica de scripts,

  • generación de reportes.

Editar tareas programadas

crontab -e

Ver tareas programadas

crontab -l

Estructura de una tarea en cron

* * * * * comando
- - - - -
| | | | |
| | | | └── día de la semana (0-6)
| | | └──── mes (1-12)
| | └────── día del mes (1-31)
| └──────── hora (0-23)
└────────── minuto (0-59)

Ejemplos

Ejecutar un script todos los días a las 2:00 am:

0 2 * * * /home/usuario/scripts/respaldo.sh

Ejecutarlo cada 30 minutos:

*/30 * * * * /home/usuario/scripts/monitoreo.sh

Ejecutarlo todos los lunes a las 8:00 am:

0 8 * * 1 /home/usuario/scripts/reporte.sh

Recomendaciones

  • usar rutas absolutas,

  • verificar permisos de ejecución,

  • guardar salida y errores en un archivo de log.

Ejemplo:

0 2 * * * /home/usuario/scripts/respaldo.sh >> /home/usuario/logs/respaldo.log 2>&1

Cron Guru

Una herramienta muy útil para entender expresiones de cron es Crontab Guru, que ayuda a interpretar y construir estas expresiones de manera más sencilla.

Ejemplos:

  • */5 * * * * → cada 5 minutos

  • 0 9 * * 1 → todos los lunes a las 9:00

  • 30 22 * * * → todos los días a las 22:30