9  Introducción al scripting

En este módulo se mostrará lo que es un script de shell, cómo definir el intérprete, asignar permisos y ejecutar scripts.

9.1 Shebang

El shebang (#!) en la primera línea de un script indica al sistema qué intérprete utilizar.

#!/bin/bash             # Bash específico
#!/usr/bin/env bash     # Más portable
#!/bin/sh               # Shell POSIX básico

Sin él, tendrías que invocar explícitamente bash script.sh.

9.2 Comentarios

  • #: los comentarios comienzan con # y el sistema los ignora.
  • Incluye metadatos, explicaciones, y ejemplos de uso.
#!/bin/bash
# Este script lista archivos FASTQ y cuenta sus líneas

9.3 Permisos de Ejecución

Para convertir un archivo en ejecutable:

chmod +x script.sh
  • rwx: permisos de lectura, escritura y ejecución.
  • Ver permisos: ls -l

9.4 Estructura Básica

#!/bin/bash
set -euo pipefail  # Configuración robusta

# Variables globales
SCRIPT_DIR="$(dirname "$0")"
OUTPUT_DIR="./results"

# Función de ayuda
usage() {
    echo "USO: $0 <input.fastq> [output_dir]"
    echo "Ejemplo: $0 sample.fastq /tmp/results"
}

# Función principal
main() {
    local input="$1"
    local output="${2:-$OUTPUT_DIR}"
    
    echo "Procesando: $input"
    mkdir -p "$output"
    
    # Procesamiento aquí
    process_file "$input" "$output"
}

# Verificar argumentos
[[ $# -eq 0 ]] && { usage; exit 1; }

# Ejecutar
main "$@"

9.5 Ejemplo Bioinformático

Nivel: conteo de lecturas en varios archivos FASTQ:

#!/bin/bash
# Cuenta lecturas en archivos FASTQ/FASTA

count_reads() {
    local file="$1"
    case "${file##*.}" in
        gz) lines=$(zcat "$file" | wc -l) ;;
        *) lines=$(wc -l < "$file") ;;
    esac
    
    # FASTQ: 4 líneas por read, FASTA: contar headers
    if [[ "$file" == *fastq* ]]; then
        echo "$((lines / 4))"
    else
        grep -c '^>' "$file"
    fi
}

for file in data/*.{fastq,fasta}{,.gz}; do
    [[ -f "$file" ]] && printf "%-20s %'d reads\n" "$(basename "$file")" "$(count_reads "$file")"
done

9.6 Consejos Avanzados y Buenas Prácticas

  • Incluye set -euo pipefail para fallar rápido ante errores y variables no definidas.
  • Usa un encabezado con usage() que muestre sintaxis y ejemplos de uso.
  • Almacena rutas en variables configurables al inicio.
  • Versiona tus scripts con comments de changelog.

9.7 Resumen de Comandos

Comando Descripción
#!/bin/bash Define intérprete de Bash
chmod +x file Da permiso de ejecución al archivo
ls path/*.fastq Lista archivos FASTQ
wc -l < file Cuenta líneas
exit 0 Salida exitosa