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:

  1. Tenga un array con las edades: 18 22 30 25 29.
  2. Calcule la media usando bc -l.
  3. 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:

  1. Muestre todos los contactos.
  2. Permita buscar un contacto pasado como argumento.
  3. 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...