#!/bin/bash
GENOME="Homo_sapiens"
READS=1000000
path_data="/home/user/data"
10 Variables & Parámetros
El finalizar este módulo serás capaz de definir variables, diferenciar tipos de comillas y manejar parámetros posicionales y opciones.
10.1 Variables
- No hay tipado: todo es cadena.
- Se asigna sin espacios alrededor del
=
.
10.2 Comillas
- Dobles (
"
): expanden variables y comandos. - Simples (
'
): contenido literal. - Escapado (
\
): para literales.
VAR="mundo"
# Dobles: expanden variables y comandos
echo "Hola $VAR" # Output: Hola mundo
echo "Fecha: $(date)" # Output: Fecha: Wed May 28...
# Simples: literales
echo 'Hola $VAR' # Output: Hola $VAR
echo 'Fecha: $(date)' # Output: Fecha: $(date)
# Sin comillas: pueden causar problemas
FILE="archivo con espacios.txt"
ls $FILE # Error: busca 3 archivos
ls "$FILE" # Correcto: un archivo
10.3 Expansión de Variables
FILE="sample.fastq"
# Expansión básica
echo "${FILE}" # sample.fastq
# Manipulación de strings
echo "${FILE%.fastq}" # sample (quita extensión)
echo "${FILE%.*}" # sample (quita última extensión)
echo "${FILE##*/}" # sample.fastq (solo nombre)
echo "${FILE%/*}" # directorio (sin nombre)
# Longitud
echo "${#FILE}" # 12 (caracteres)
# Valores por defecto
echo "${OUTPUT_DIR:-./results}" # ./results si OUTPUT_DIR vacía
echo "${THREADS:=4}" # asigna 4 si THREADS vacía
10.4 Argumentos Posicionales
$1
,$2
, …$N
.$0
es el nombre del script.$@
o$*
: todos los argumentos.$#
: conteo de argumentos.
#!/bin/bash
# Uso: bash setup.sh input.fasta output.txt
in=$1
out=$2
if [[ $# -ne 2 ]]; then
echo "Uso: $0 <in.fasta> <out.txt>"; exit 1
fi
# convertir FASTA a lista de secuencias
grep -v '>' "$in" > "$out"
10.5 Verifica el número de argumentos
if [[ $# -ne 3 ]]; then
echo "Error: Se requieren 3 argumentos"
echo "Uso: $0 <referencia> <reads> <output>"
exit 1
fi
# Asignar a variables con nombres descriptivos
REFERENCE="$1"
READS="$2"
OUTPUT="$3"
10.6 Ejemplo Bioinformático
10.6.1 Procesar de muestras múltiples
#!/bin/bash
# Procesar múltiples muestras de RNA-seq
# Arrays de muestras
SAMPLES=(control_1 control_2 treated_1 treated_2)
CONDITIONS=(control control treated treated)
# Procesar cada muestra
for i in "${!SAMPLES[@]}"; do
sample="${SAMPLES[$i]}"
condition="${CONDITIONS[$i]}"
echo "=== Procesando $sample ($condition) ==="
# Rutas de archivos
R1="data/${sample}_R1.fastq.gz"
R2="data/${sample}_R2.fastq.gz"
OUTPUT="results/${sample}"
# Verificar archivos
if [[ ! -f "$R1" || ! -f "$R2" ]]; then
echo "Warning: Archivos no encontrados para $sample"
continue
fi
# Crear directorio de salida
mkdir -p "$OUTPUT"
# Alineamiento (ejemplo)
echo "Alineando $sample..."
# hisat2 -x genome_index -1 "$R1" -2 "$R2" -S "$OUTPUT/${sample}.sam"
echo "$sample completado"
done
10.6.2 Configuración flexible con variables
#!/bin/bash
# Pipeline con configuración externa
# Archivo de configuración
CONFIG_FILE="${1:-config.txt}"
# Leer configuración
source "$CONFIG_FILE" 2>/dev/null || {
echo "Creando archivo de configuración: $CONFIG_FILE"
cat > "$CONFIG_FILE" << 'EOF'
# Configuración del pipeline
THREADS=8
MEMORY="16G"
GENOME_INDEX="/path/to/genome_index"
ADAPTER_SEQUENCE="AGATCGGAAGAGC"
MIN_LENGTH=50
QUALITY_CUTOFF=20
EOF
echo "Edita $CONFIG_FILE y vuelve a ejecutar"
exit 1
}
echo "Configuración cargada:"
echo " Threads: $THREADS"
echo " Memoria: $MEMORY"
echo " Índice: $GENOME_INDEX"
# Usar variables en el pipeline
run_trimming() {
local input_r1="$1"
local input_r2="$2"
local output_prefix="$3"
cutadapt \
-a "$ADAPTER_SEQUENCE" \
-A "$ADAPTER_SEQUENCE" \
-m "$MIN_LENGTH" \
-q "$QUALITY_CUTOFF" \
-j "$THREADS" \
-o "${output_prefix}_R1_trimmed.fastq.gz" \
-p "${output_prefix}_R2_trimmed.fastq.gz" \
"$input_r1" "$input_r2"
}
10.6.3 Manejo robusto de parámetros
#!/bin/bash
# Script robusto para alineamiento
set -euo pipefail
# Función de validación
validate_inputs() {
local ref="$1"
local reads="$2"
# Verificar archivos
[[ ! -f "$ref" ]] && { echo "Error: Referencia no encontrada: $ref"; return 1; }
[[ ! -f "$reads" ]] && { echo "Error: Reads no encontrados: $reads"; return 1; }
# Verificar formato
case "${ref##*.}" in
fa|fasta) echo "Referencia FASTA: OK" ;;
*) echo "Warning: Extensión de referencia inusual"; ;;
esac
case "${reads##*.}" in
fastq|fq) echo "Reads FASTQ: OK" ;;
gz) [[ "$reads" =~ \.(fastq|fq)\.gz$ ]] && echo "Reads FASTQ comprimidos: OK" ;;
*) echo "Error: Formato de reads no soportado"; return 1 ;;
esac
return 0
}
# Función principal
main() {
local reference="$1"
local reads="$2"
local output="${3:-alignment.sam}"
local threads="${4:-4}"
echo "=== Parámetros ==="
echo "Referencia: $reference"
echo "Reads: $reads"
echo "Output: $output"
echo "Threads: $threads"
# Validar inputs
validate_inputs "$reference" "$reads"
# Ejecutar alineamiento
echo "Iniciando alineamiento..."
# bwa mem -t "$threads" "$reference" "$reads" > "$output"
echo "Completado: $output"
}
# Verificar argumentos mínimos
if [[ $# -lt 2 ]]; then
echo "USO: $0 <referencia> <reads> [output] [threads]"
echo "Ejemplo: $0 genome.fa sample.fastq alignment.sam 8"
exit 1
fi
main "$@"
10.7 Consejos Avanzados y Buenas Prácticas
- Valida siempre el número y tipo de argumentos.
- Provee flags
-h
o--help
conusage()
. - Usa patrones POSIX para compatibilidad con otros shells.
- Evita variables globales innecesarias; usa funciones.
10.8 Resumen de Comandos
Comando | Descripción |
---|---|
VAR=value |
Declara variable |
"$VAR" |
Uso seguro respectando espacios |
$@ , $# |
Lista y conteo de argumentos |
case...esac |
Manejo de opciones más complejo |