Curso de Shell Scripting

El control de flujo permite que los scripts sean dinámicos: que tomen decisiones, ejecuten caminos diferentes y repitan tareas según condiciones.


5.1. Condiciones: [ ] vs [[ ]]

En Bash hay dos formas principales de comprobar condiciones.

SintaxisCaracterísticas principales
[ ]Tradicional, compatible con POSIX. Limitada.
[[ ]]Extensión de Bash, más potente y segura (recomendada en Bash).

✅ Usa [[ ]] siempre que trabajes en Bash moderno.


▸ Ejemplo básico

1X=10
2if [[ $X -gt 5 ]]; then
3  echo "X es mayor que 5"
4fi

Operadores comunes en comparaciones numéricas:

OperadorSignificado
-eqIgual a
-neDistinto de
-gtMayor que
-ltMenor que
-geMayor o igual que
-leMenor o igual que

▸ Comparaciones de cadenas

1NOMBRE="Angel"
2
3if [[ $NOMBRE == "Angel" ]]; then
4  echo "Coincide"
5fi

Otros operadores:

  • != → distinto
  • -z VAR → cadena vacía
  • -n VAR → cadena no vacía

▸ Comprobación de archivos

1if [[ -f "mi_archivo.txt" ]]; then
2  echo "El archivo existe"
3fi

Operadores útiles:

  • -f → existe y es archivo
  • -d → existe y es directorio
  • -r → se puede leer
  • -w → se puede escribir
  • -x → es ejecutable

5.2. Estructura completa if / elif / else

1#!/usr/bin/env bash
2set -Eeuo pipefail
3
4NUM=15
5
6if [[ $NUM -gt 20 ]]; then
7  echo "Mayor que 20"
8elif [[ $NUM -ge 10 ]]; then
9  echo "Entre 10 y 20"
10else
11  echo "Menor que 10"
12fi

Salida:

Entre 10 y 20

5.3. Sentencia case

Más clara que varios if cuando hay muchas opciones.

1#!/usr/bin/env bash
2
3read -p "Elige una opción (start/stop/restart): " OPCION
4
5case $OPCION in
6  start)
7    echo "Iniciando servicio..."
8    ;;
9  stop)
10    echo "Deteniendo servicio..."
11    ;;
12  restart)
13    echo "Reiniciando servicio..."
14    ;;
15  *)
16    echo "Opción no válida"
17    ;;
18esac

5.4. Bucles for

El bucle for itera sobre elementos de una lista.


▸ Iterar sobre lista de valores

1for i in 1 2 3 4 5; do
2  echo "Número: $i"
3done

▸ Iterar sobre archivos

1for archivo in *.txt; do
2  echo "Procesando $archivo"
3done

▸ Estilo C (con contador)

1for ((i=1; i<=5; i++)); do
2  echo "Iteración $i"
3done

5.5. Bucles while

Ejecuta mientras la condición sea verdadera.

1CONTADOR=1
2while [[ $CONTADOR -le 5 ]]; do
3  echo "Contador: $CONTADOR"
4  ((CONTADOR++))
5done

5.6. Bucles until

Ejecuta hasta que la condición sea verdadera (inverso de while).

1X=1
2until [[ $X -gt 5 ]]; do
3  echo "X vale $X"
4  ((X++))
5done

5.7. Lectura de datos con read

1read -p "Introduce tu nombre: " NOMBRE
2echo "Hola, $NOMBRE"

Opciones útiles:

  • -p → mostrar mensaje
  • -s → entrada silenciosa (para contraseñas)
  • -r → desactiva interpretación de barras invertidas

5.8. Control del bucle: break y continue

1for i in {1..5}; do
2  if [[ $i -eq 3 ]]; then
3    echo "Saltando $i"
4    continue        # Salta a la siguiente iteración
5  fi
6  if [[ $i -eq 5 ]]; then
7    echo "Rompiendo el bucle"
8    break           # Termina el bucle
9  fi
10  echo "Número: $i"
11done

🏋️‍♂️ Ejercicio práctico 1

Crea un script llamado clasificar_edad.sh que:

  1. Pida al usuario su edad.

  2. Muestre:

    • <18 → Menor de edad
    • 18-64 → Adulto
    • >=65 → Senior

Ejemplo:

Introduce tu edad: 20
Eres Adulto

🏋️‍♂️ Ejercicio práctico 2

Crea un script llamado buscador_logs.sh que:

  1. Pida al usuario un texto a buscar.
  2. Revise todos los archivos .log en la carpeta actual.
  3. Muestre cuántas veces aparece el texto en total.
  4. Si no encuentra coincidencias, muestre un mensaje adecuado.

Pistas:

  • Usa grep -c para contar en cada archivo.
  • Usa un bucle for.

🏋️‍♂️ Ejercicio práctico 3

Crea un script llamado menu.sh que use case para:

  • Opción 1 → Listar archivos del directorio actual.
  • Opción 2 → Mostrar el espacio libre en disco.
  • Opción 3 → Salir.

  • Loading...