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):
| Flujo | Descriptor | Descripción |
|---|---|---|
| STDIN | 0 | Entrada estándar (por defecto, teclado) |
| STDOUT | 1 | Salida estándar (por defecto, pantalla) |
| STDERR | 2 | Salida 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 5EOFSalida 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:
- Guarde la lista de procesos en
procesos.txt. - Guarde solo los que contengan la palabra
bashenbash_procesos.txt. - Cuente cuántas líneas tiene el archivo filtrado y lo muestre en pantalla.
- Guarde los errores (si los hubiera) en
errores.txt.
💡 Pistas:
- Usa
ps auxpara listar procesos. - Usa tubería
|congrep. - Usa
wc -lpara 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
- Redirige errores siempre → así evitas mensajes molestos en pantalla y puedes depurar.
- Usa
>>para logs → no pierdes el historial. - Con tuberías largas, lee de izquierda a derecha → cada paso transforma los datos.
- Para textos grandes, usa
lessohead/tailpara ver partes.
🏋️♂️ Ejercicio final del módulo
Crea un script llamado resumen_logs.sh que:
- Tome todos los archivos
.logde la carpeta actual. - Guarde en
errores.txttodas las líneas que contengan la palabraERROR. - Cuente cuántos errores hay en total.
- 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.txtSalida de Consola!: Se encontraron 0 errores en los logs
- Loading...