Curso de Shell Scripting

Cuando ejecutamos comandos, cada uno puede recibir datos (entrada) y producir datos (salida). El shell nos permite redirigir esas entradas y salidas para encadenar procesos.


2.1. Conceptos básicos

Cada comando trabaja con flujos de datos (streams):

FlujoDescriptorDescripción
STDIN0Entrada estándar (por defecto, teclado)
STDOUT1Salida estándar (por defecto, pantalla)
STDERR2Salida de errores estándar

👉 Podemos decirle a un comando de dónde leer (entrada) y a dónde enviar lo que produce (salida).


2.2. Redirecciones de salida

▸ Sobrescribir un archivo: >

Escribe la salida en un archivo (borra el contenido anterior):

1echo "Hola mundo" > salida.txt

👉 Si salida.txt existía, se sobreescribe.


▸ Añadir al final de un archivo: >>

Agrega contenido sin borrar lo que ya existe:

1echo "Nueva línea" >> salida.txt

2.3. Redirecciones de error

Algunos comandos generan errores en STDERR (2). Por defecto los ves en pantalla, pero puedes redirigirlos:

1ls /no-existe 2> errores.txt

👉 El error se guarda en errores.txt.

Para guardar salida normal y errores juntos:

1comando > todo.txt 2>&1

O en Bash moderno:

1comando &> todo.txt

2.4. Redirecciones de entrada

Puedes hacer que un comando lea datos desde un archivo en lugar del teclado:

1sort < nombres.txt

2.5. Heredoc <<

Sirve para enviar un bloque de texto como entrada al comando.

Ejemplo:

1cat << EOF
2Hola
3Este texto
4viene de un heredoc
5EOF
Salida de Consola!:
Hola
Este texto
viene de un heredoc

2.6. Here-string <<<

Envía una sola línea como entrada:

1wc -w <<< "Hola mundo shell"
Salida de Consola!:
3

(El texto tiene 3 palabras).


2.7. Tuberías |

Las tuberías permiten encadenar comandos: la salida de uno es la entrada del siguiente.

1ls /etc | grep conf

👉 ls lista archivos, y grep filtra los que contienen “conf”.


2.8. Ejemplo práctico

Crea un script llamado log_info.sh que:

  1. Guarde la lista de procesos en procesos.txt.
  2. Guarde solo los que contengan la palabra bash en bash_procesos.txt.
  3. Cuente cuántas líneas tiene el archivo filtrado y lo muestre en pantalla.
  4. Guarde los errores (si los hubiera) en errores.txt.

💡 Pistas:

  • Usa ps aux para listar procesos.
  • Usa tubería | con grep.
  • Usa wc -l para contar líneas.

🔥 Ejemplo de solución:

1#!/usr/bin/env bash
2
3# Guardar lista completa de procesos
4ps aux > procesos.txt 2> errores.txt
5
6# Filtrar solo los procesos con 'bash'
7grep bash procesos.txt > bash_procesos.txt 2>> errores.txt
8
9# Contar los procesos bash
10NUM=$(wc -l < bash_procesos.txt)
11
12echo "Número de procesos bash: $NUM"

Ejecución:

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

Salida esperada (varía según el sistema):

Número de procesos bash: 3

🟩 Buenas prácticas

  1. Redirige errores siempre → así evitas mensajes molestos en pantalla y puedes depurar.
  2. Usa >> para logs → no pierdes el historial.
  3. Con tuberías largas, lee de izquierda a derecha → cada paso transforma los datos.
  4. Para textos grandes, usa less o head/tail para ver partes.

🏋️‍♂️ Ejercicio final del módulo

Crea un script llamado resumen_logs.sh que:

  1. Tome todos los archivos .log de la carpeta actual.
  2. Guarde en errores.txt todas las líneas que contengan la palabra ERROR.
  3. Cuente cuántos errores hay en total.
  4. Muestre el resultado en pantalla y lo añada a un archivo reporte_final.txt.
1#!/usr/bin/env bash
2# Buscar líneas con ERROR en todos los .log
3grep "ERROR" *.log > errores.txt 2>/dev/null
4
5# Contar cuántas líneas hay
6cantidad=$(wc -l < errores.txt)
7
8# Mensaje final
9mensaje="Se encontraron $cantidad errores en los logs"
10
11# Mostrar por pantalla
12echo "$mensaje"
13
14# Guardar en reporte_final.txt
15echo "$mensaje" >> reporte_final.txt
Salida de Consola!:
Se encontraron 0 errores en los logs
  • Loading...