Bash Script – DÍA 4

Argumentos y parámetros especiales: $1, $#, «$@», shift

(cómo hacer scripts realmente reutilizables)


1. Objetivo del día

Hoy aprenderás a:

  • pasar datos al script desde la terminal
  • usar $1, $2, $3
  • contar cuántos argumentos llegan ($#)
  • recorrer todos los argumentos ("$@")
  • usar shift para mover argumentos
  • validar entradas

Esto permitirá crear scripts:

  • que acepten rutas
  • que procesen listas
  • que ejecuten acciones sobre varios elementos
  • que sean usados por otros compañeros

2. Requisitos

  • Días 1–3 completados
  • Saber usar bucles y condicionales

3. ¿Qué son los argumentos?

Cuando ejecutas:

./script.sh hola mundo

Los argumentos son:

  • $1 → hola
  • $2 → mundo

El script puede acceder a ellos.


4. Parámetros especiales

SímboloSignificado
$1primer argumento
$2segundo argumento
$@todos los argumentos
$#número de argumentos
$0nombre del script
"$@"cada argumento como elemento separado
shiftdesplazar argumentos hacia la izquierda

5. Usar $1, $2, $3…

Ejemplo básico:

#!/bin/bash

echo "Primer argumento: $1"
echo "Segundo argumento: $2"

Ejecutar:

./args.sh uno dos

6. Saber cuántos argumentos llegan: $#

echo "Has pasado $# argumentos"

Ejemplo real:

if [ $# -lt 1 ]; then
    echo "Uso: $0 <archivo>"
    exit 1
fi

7. Recorrer todos los argumentos: "$@"

Ejemplo práctico:

#!/bin/bash

for arg in "$@"; do
    echo "Argumento: $arg"
done

Ejecutar:

./listar.sh uno dos tres

8. Usar shift (muy útil para scripts complejos)

shift mueve los argumentos:

Antes:

$1 = uno
$2 = dos
$3 = tres

Tras ejecutar:

shift

Queda:

$1 = dos
$2 = tres

Ejemplo real:

#!/bin/bash

while [[ $# -gt 0 ]]; do
    echo "Procesando: $1"
    shift
done

9. Script real: procesar varios ficheros

Crear un script:

#!/bin/bash

if [[ $# -lt 1 ]]; then
    echo "Uso: $0 archivo1 archivo2 ..."
    exit 1
fi

for archivo in "$@"; do
    if [[ -f "$archivo" ]]; then
        echo "$archivo existe"
    else
        echo "$archivo NO existe"
    fi
done

Ejecutar:

./check_files.sh a.txt b.txt c.txt

10. Script real: probar conectividad a múltiples servidores

#!/bin/bash

if [[ $# -lt 1 ]]; then
    echo "Uso: $0 servidor1 servidor2 ..."
    exit 1
fi

for host in "$@"; do
    echo -n "Ping a $host: "
    if ping -c 1 "$host" >/dev/null 2>&1; then
        echo "OK"
    else
        echo "FALLO"
    fi
done

11. Práctica guiada (20–30 minutos)

11.1. Crear un script que compruebe un archivo pasado como argumento

Script: comprueba_arg.sh

#!/bin/bash

if [[ $# -ne 1 ]]; then
    echo "Uso: $0 <archivo>"
    exit 1
fi

if [[ -f "$1" ]]; then
    echo "El archivo existe"
else
    echo "El archivo NO existe"
fi

Ejemplo de uso:

./comprueba_arg.sh datos.txt

Salida si existe:

El archivo existe

Salida si no existe:

El archivo NO existe

11.2. Recorrer todos los argumentos

Script: recorre.sh

#!/bin/bash

echo "Número de argumentos: $#"
echo "Lista completa: $@"
echo "----"

for arg in "$@"; do
    echo "Procesando: $arg"
done

Ejemplo:

./recorre.sh uno dos tres

Salida:

Número de argumentos: 3
Lista completa: uno dos tres
----
Procesando: uno
Procesando: dos
Procesando: tres

11.3. Script usando shift para ir “consumiendo” argumentos

Esto es algo que muchos scripts profesionales hacen: procesar opciones una a una.

Script: procesa.sh

#!/bin/bash

echo "Argumentos iniciales: $@"

while [[ $# -gt 0 ]]; do
    echo "Tomando: $1"
    shift
done

echo "Sin argumentos restantes."

Ejemplo:

./procesa.sh a b c d

Salida:

Argumentos iniciales: a b c d
Tomando: a
Tomando: b
Tomando: c
Tomando: d
Sin argumentos restantes.

Esto muestra claramente que shift va eliminando el primer argumento en cada iteración.


12. Checklist del Día 4

  • Sabes usar $1, $2
  • Sabes usar $# para contar argumentos
  • Usas "$@" para recorrerlos
  • Has usado shift
  • Validaste argumentos con condicionales
  • Has creado scripts reutilizables

Si todo está marcado → Día 4 superado.


13. Ejercicio sugerido

Crea un script llamado:

multiping.sh

Que:

  1. Reciba varios hosts como argumentos
  2. Para cada uno haga:
    • ping -c1
    • nslookup
    • comprobar puerto 443 con nc
  3. Muestre un resumen del tipo:
google.com: ping OK, dns OK, puerto OK
192.168.1.1: ping FAIL, dns FAIL, puerto FAIL

Este será un anticipo del proyecto final del Día 7.


14. Día 4 completado

Ya tienes scripts REUTILIZABLES, que aceptan argumentos y procesan listas desde fuera.
Esto es exactamente lo que diferencia a un usuario de un profesional.

Mañana entramos al corazón “avanzado”:

👉 Día 5 – Funciones en Bash: modularización, variables locales, retorno, organización del script

Este día hará que tus scripts parezcan profesionales de verdad.