Estructuras de control

1) Condiciones: if y pruebas [ ], [[ ]]

Estructura general:

if comando_o_condicion; then
# caso verdadero
elif otra_condicion; then
# segundo caso
else
# caso por defecto
fi

1.1 Probar comandos

if grep -q "^>" genes.fasta; then
echo "Parece un FASTA válido"
else
echo "No veo encabezados FASTA (líneas con >)"
fi

1.2 Probar expresiones: [ ] vs [[ ]] Usa [[ … ]] (Bash) cuando puedas: mejor con patrones, evita problemas de globbing/espacios.

Operadores comunes:

Cadenas: =, !=, -z (vacía), -n (no vacía)

Números:

  • eq → igual a (== numérico)

  • ne → distinto de

  • lt → menor que

  • le → menor o igual que

  • gt → mayor que

  • ge → mayor o igual que

Ejemplo:

x=12
if [[ "$x" -gt 10 ]]; then
echo "x es mayor a 10"
fi

1.3 Operadores lógicos

En Bash puedes combinar condiciones con && (AND) y || (OR).

if [[ "$x" -gt 10 && "$y" -le 5 ]] || [[ -n "${FLAG:-}" ]]; then
echo "Se cumple (x>10 Y y<=5) O la variable FLAG no está vacía"
fi

Explicación:

  • [[ "$x" -gt 10 && "$y" -le 5 ]]: ambas condiciones deben cumplirse (AND).

  • [[ -n "${FLAG:-}" ]]: la variable FLAG no es vacía. ${FLAG:-} evita error si FLAG no existe.

  • || significa OR, basta que uno de los dos bloques sea verdadero.

2) Bucles for, while, until

2.1 for: recorrer listas

Forma 1 (lista explícita):

for n in 1 2 3; do
echo "Iteración $n"
done

Forma 2 (expansión aritmética):

for ((i=1; i<=5; i++)); do
echo "i=$i"
done
  • (()) se usa para operaciones aritméticas.

  • i=1 valor inicial.

  • i<=5 condición de fin.

  • i++ incremento en cada vuelta.

Forma 3 (sobre archivos):

shopt -s nullglob
for f in *.fastq.gz; do
echo "Archivo: $f"
done

2.2 while read (patrón robusto para listas grandes y espacios)

find datos -type f -name "*.fastq.gz" -print0 | while IFS= read -r -d '' fq; do
echo "Procesando: $fq"
zcat -- "$fq" | awk 'END{print NR/4}'
done

2.3 while y until con condiciones

x=0
while (( x < 3 )); do
echo "x=$x"; ((x++))
done


until [[ -f salida.txt ]]; do
echo "Esperando salida.txt..."; sleep 1
((++i>10)) && { echo "Timeout"; break; }
done

3) case: múltiples ramas con patrones

ext=${1##*.}
case "$ext" in
fasta|fa) echo "FASTA" ;;
fastq|fq) echo "FASTQ" ;;
gz) echo "GZIP" ;;
*) echo "Desconocido" ;;
esac

4) Funciones reutilizables y retorno de errores

contar(){
local num=$1
if [[ $num -lt 0 ]]; then
echo "Número negativo"; return 1
else
echo $((num*2))
fi
}


res=$(contar 5)
echo "Resultado: $res"