Curso de Shell Scripting
En los scripts, la mayoría del trabajo consiste en tomar datos, transformarlos y usarlos. Bash ofrece varias herramientas para esto: expansión de parámetros, operaciones aritméticas y arrays.
4.1. Expansión de parámetros ${…}
La expansión es la forma en que Bash sustituye una variable por su valor.
▸ Sintaxis básica
1NOMBRE="Angel" 2echo "Hola ${NOMBRE}"
👉 El uso de {} evita errores cuando el texto sigue a la variable:
1ARCHIVO="log" 2echo "Procesando ${ARCHIVO}s" # correcto → Procesando logs 3echo "Procesando $ARCHIVOs" # incorrecto
▸ Valores por defecto
Permite usar un valor si la variable no está definida o está vacía.
1echo "Usuario: ${USUARIO:-invitado}"
👉 Si USUARIO no existe, mostrará: Usuario: invitado.
▸ Asignar valor por defecto
Si no existe la variable, la define:
1echo "Ruta: ${DIRECTORIO:=/tmp}"
▸ Sustituir subcadenas
- Reemplazar la primera coincidencia:
1ARCHIVO="foto.png" 2echo "${ARCHIVO/.png/.jpg}" # foto.jpg
- Reemplazar todas las coincidencias:
1TEXTO="2025-09-30" 2echo "${TEXTO//-//}" # 2025//09//30
▸ Obtener longitud de una variable
1CADENA="Hola Mundo" 2echo "Longitud: ${#CADENA}" # 10
4.2. Aritmética en Bash
Bash permite operaciones aritméticas simples con números enteros.
▸ Usando (( ))
1A=5 2B=3 3((C=A+B)) 4echo "Resultado: $C" # Resultado: 8
👉 También se pueden usar operadores: +, -, *, /, %, ** (potencia).
▸ Usando $(( )) (sustitución)
Para imprimir el resultado directamente:
1echo "La suma es $((4+6))" # La suma es 10
▸ Incremento y decremento
1X=10 2((X++)) 3echo $X # 11 4 5((X--)) 6echo $X # 10
⚠️ Nota
Bash solo maneja enteros de forma nativa.
Para números decimales usa herramientas externas como bc o awk.
Ejemplo con bc:
1echo "10 / 3" | bc -l # 3.333333
4.3. Arrays en Bash
Un array es una lista ordenada de elementos. En Bash hay arrays indexados y asociativos (tipo diccionario).
▸ Arrays indexados (por posición)
1# Definir array 2NOMBRES=("Ana" "Luis" "María") 3 4# Acceder a elementos 5echo "Primer nombre: ${NOMBRES[0]}" 6 7# Añadir elemento 8NOMBRES+=("Pedro") 9 10# Ver todos los elementos 11echo "Todos: ${NOMBRES[@]}" 12 13# Número de elementos 14echo "Cantidad: ${#NOMBRES[@]}"
▸ Recorrer arrays con for
1for nombre in "${NOMBRES[@]}"; do 2 echo "Hola $nombre" 3done
▸ Arrays asociativos (requiere Bash ≥4)
Se comportan como diccionarios (clave → valor).
1declare -A EDADES 2 3EDADES["Ana"]=25 4EDADES["Luis"]=30 5 6echo "Edad de Ana: ${EDADES[Ana]}"
Recorrerlos:
1for persona in "${!EDADES[@]}"; do 2 echo "$persona tiene ${EDADES[$persona]} años" 3done
4.4. Slices (rebanadas) y subcadenas
Puedes tomar partes de una cadena o de un array.
▸ Subcadenas
1TEXTO="HolaMundo" 2echo "${TEXTO:0:4}" # Hola 3echo "${TEXTO:4}" # Mundo
▸ Partes de un array
1NUMEROS=(10 20 30 40 50) 2echo "${NUMEROS[@]:1:3}" # 20 30 40
🏋️♂️ Ejercicio práctico 1
Crea un script llamado estadisticas.sh que:
- Tenga un array con las edades:
18 22 30 25 29. - Calcule la media usando
bc -l. - Muestre cuántas edades son mayores o iguales a 25.
Salida esperada:
Media de edades: 24.8
Mayores o iguales a 25: 3
🏋️♂️ Ejercicio práctico 2
Crea un script llamado agenda.sh que use un array asociativo con 3 contactos (nombre → teléfono) y:
- Muestre todos los contactos.
- Permita buscar un contacto pasado como argumento.
- Si no se pasa argumento, muestre un mensaje de ayuda.
Ejemplo de ejecución:
1./agenda.sh Luis
Salida esperada:
Teléfono de Luis: 654321789- Loading...