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/bashMi primer script: Hola Mundo
Crear el archivo:
nano hola.shEscribir el siguiente contenido:
#!/bin/bash
echo "Hola Mundo"Guardar el archivo, otorgar permisos de ejecución y ejecutarlo:
chmod +x hola.sh
./hola.shEstructura 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
datePermisos y ejecución
Para ejecutar un script directamente:
chmod +x script.sh
./script.shTambién puede ejecutarse así:
bash script.shVariables 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.fastqResultado esperado:
El primer argumento es: archivo1.fastqAlgunos 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.txtAgregar contenido sin sobrescribir
echo "Nueva línea" >> salida.txtLeer 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.txtEstructuras 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"
fiEjemplo 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"
fiAlgunas 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
doneExplicación
forinicia el buclevariableguarda temporalmente cada elementoin listaindica qué elementos se van a recorrerdomarca el inicio de los comandos a repetirdonemarca el final del bucle
Primer ejemplo sencillo:
for nombre in Ana Luis Carmen; do
echo "Hola, $nombre"
doneEl 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"
doneEjercicio: uso de
foren BashEscribe un script en Bash que realice lo siguiente:
Muestre en pantalla los números del 1 al 100.
Después, muestre en pantalla los números del 2 al 100 avanzando de 2 en 2.
Recorre las muestras de la carpeta
/home/cristian/mi_proyecto/data/rawque terminan en.fq.gzy muestra para cada una el mensajeProcesando <nombre_de_la_muestra>usando la variablemuestra.
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
doneCómo funciona while
contador=1
while [ $contador -le 3 ]; do
echo "Iteración $contador"
contador=$((contador + 1))
donePaso a paso
contador=1Bash evalúa la condición:
[ $contador -le 3 ]Como
1 <= 3, entra al bucle.Ejecuta:
echo "Iteración 1"- Luego aumenta el contador:echo “Iteración 1”
contador=$((contador + 1))Vuelve a evaluar la condición.
Cuando
contadorya no cumple, el bucle termina.
Comando read
read toma una línea y la guarda en variable.
read variableEjemplo interactivo:
#!/bin/bash
read -p "Escribe tu nombre: " nombre
echo "Hola, $nombre"Aquí:
-pmuestra 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.txtread lineatoma una líneawhilerepite eso hasta llegar al final del archivodone < archivo.txthace que la entrada venga del archivo y no del teclado
Ejercicio:
Instrucciones
Crear un archivo llamado
nombres.txt.Escribir dentro 10 nombres, uno por línea.
Crear un script en Bash que lea el archivo con
while.El script debe contar cuántas líneas tiene el archivo.
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
DiegoTarea:
Crear un script llamado
contar_lecturas.sh.El script debe recibir el nombre del archivo como argumento.
Debe detectar si el archivo está comprimido (
.gz) o no.Debe contar cuántas lecturas hay en el archivo.
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"
}
saludarFunció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 -eVer 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 minutos0 9 * * 1→ todos los lunes a las 9:0030 22 * * *→ todos los días a las 22:30