Curso de Shell Scripting

Los fundamentos te enseñan cómo se comporta el shell al ejecutar comandos y cómo manejar datos básicos. Esto es clave para que tus scripts sean predecibles y sin errores.


1.1. Comandos básicos y rutas

Los scripts son básicamente secuencias de comandos. Para usarlos bien, debes comprender rutas absolutas y relativas.

  • Ruta absoluta: empieza desde / (la raíz del sistema).

    • Ejemplo: /home/angel/proyecto/hola.sh
  • Ruta relativa: parte de tu carpeta actual.

    • Ejemplo: ./hola.sh

📌 Ejemplo:

1pwd           # Muestra la carpeta actual
2cd /tmp       # Cambia a /tmp
3ls            # Lista los archivos
4./hola.sh     # Ejecuta el script en la carpeta actual

✅ Siempre usa ./ para ejecutar un script que está en el directorio actual. ❌ No confíes en que el shell busque en el PATH (más seguro especificar la ruta).


1.2. Variables de entorno y de usuario

Las variables almacenan valores que podemos usar en los scripts.

  • Definir variable temporal (solo en esa sesión):
1NOMBRE="Angel"
2echo "Hola $NOMBRE"
Salida de Consola!:
Hola Angel
  • Hacerla disponible para procesos hijos:
1export NOMBRE
  • Algunas variables comunes:

    • $HOME → Carpeta personal
    • $USER → Usuario actual
    • $PWD → Carpeta actual
    • $PATH → Directorios donde el shell busca comandos

🔥 Ejemplo práctico:

1#!/usr/bin/env bash
2# guardar como info.sh
3echo "Usuario: $USER"
4echo "Carpeta: $PWD"
5echo "Shell: $SHELL"
Salida de Consola!:
Usuario: Manuel
Carpeta: /box/submission
Shell: /bin/sh

Ejecuta:

1chmod +x info.sh
2./info.sh

1.3. Quoting: '', "", y escape \

Los quotes controlan cómo interpreta el shell el texto.

SímboloComportamiento
'...'Comillas simples: el texto se toma literal.
"..."Comillas dobles: permiten expansión de variables.
\Escape: interpreta solo el carácter siguiente.

📌 Ejemplo:

1NOMBRE="Angel"
2echo 'Hola $NOMBRE'    # No expande la variable → Hola $NOMBRE
3echo "Hola $NOMBRE"    # Sí expande → Hola Angel
4echo "Precio: \$50"    # Muestra el símbolo $ → Precio: $50
Salida de Consola!:
Hola $NOMBRE
Hola Angel
Precio: $50

⚠️ Este tema es crítico al trabajar con datos externos (evita inyección de comandos).


1.4. Globbing: * ? [ ]

El globbing permite usar patrones para seleccionar archivos.

PatrónSignificado
*Cualquier cadena (incluido vacío)
?Un solo carácter
[abc]Uno de esos caracteres
[a-z]Rango de caracteres

📦 Ejemplo:

En una carpeta con:

a.txt  b.txt  c.log  datos1.csv  datos2.csv

Prueba:

1touch a.txt b.txt c.log datos1.csv datos2.csv menu.txt
2echo *.txt        # a.txt b.txt
3echo datos?.csv   # datos1.csv datos2.csv
4echo [ab].txt     # a.txt b.txt
Salida de Consola!:
a.txt b.txt
datos1.csv
a.txt b.txt

1.5. Códigos de salida y operadores && ||

Cada comando devuelve un código de salida:

  • 0 → Éxito
  • Distinto de 0 → Error

Se puede comprobar con $?:

1ls /etc2
2echo "Código de salida: $?"
Salida de Consola!:
Código de salida: 2

Uso con && y ||

  • comando1 && comando2 → Ejecuta comando2 solo si comando1 fue exitoso.
  • comando1 || comando2 → Ejecuta comando2 solo si comando1 falló.

📌 Ejemplo:

1mkdir nueva && echo "Carpeta creada"
2ls inexistente || echo "El listado falló"
Salida de Consola!:
Carpeta creada
El listado falló

🏋️‍♂️ Ejercicio práctico

Crea un script llamado resumen.sh que:

  1. Muestre el usuario y la carpeta actual.
  2. Cree (si no existe) una carpeta llamada reportes.
  3. Liste todos los archivos .log de la carpeta actual.
  4. Si hay al menos uno, muestre el mensaje: “Se encontraron logs”. Si no hay, muestre: “No se encontraron logs”.

💡 Pistas:

  • Usa mkdir -p reportes para crear solo si no existe.
  • Usa ls *.log y && / || para los mensajes.
1#!/usr/bin/env bash
2echo "Usuario: $(whoami)"
3echo "Carpeta actual: $(pwd)"
4
5echo "Creando carpeta reportes..."
6mkdir -p reportes
7
8echo "Buscando archivos .log..."
9
10ls *.log 2>/dev/null && echo "Se encontraron logs" || echo "No se encontraron logs"
Salida de Consola!:
Usuario: angel
Carpeta actual: /home/angel/proyectos
Creando carpeta reportes...
No se encontraron logs
  • Loading...