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
fi1.1 Probar comandos
if grep -q "^>" genes.fasta; then
echo "Parece un FASTA válido"
else
echo "No veo encabezados FASTA (líneas con >)"
fi1.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"
fi1.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"
fiExplicació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"
doneForma 2 (expansión aritmética):
for ((i=1; i<=5; i++)); do
echo "i=$i"
done(())se usa para operaciones aritméticas.i=1valor inicial.i<=5condición de fin.i++incremento en cada vuelta.
Forma 3 (sobre archivos):
shopt -s nullglob
for f in *.fastq.gz; do
echo "Archivo: $f"
done2.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}'
done2.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; }
done3) case: múltiples ramas con patrones
ext=${1##*.}
case "$ext" in
fasta|fa) echo "FASTA" ;;
fastq|fq) echo "FASTQ" ;;
gz) echo "GZIP" ;;
*) echo "Desconocido" ;;
esac4) 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"