Saltar al contenido principal

Clase 02 — Entrada y Salida (I/O)

echo — Imprimir texto

#!/bin/bash

# Texto simple
echo "Hola Mundo"

# Sin salto de línea al final
echo -n "Cargando..."
echo " Listo!"

# Interpretar caracteres especiales
echo -e "Línea 1\nLínea 2\nLínea 3"
echo -e "Columna1\tColumna2\tColumna3"
echo -e "\033[32mTexto en verde\033[0m"
echo -e "\033[31mTexto en rojo\033[0m"
echo -e "\033[1mTexto en negrita\033[0m"

printf — Formato avanzado

#!/bin/bash

# Formato con printf (más control que echo)
nombre="RoxsRoss"
edad=30
salario=5500.50

printf "Nombre: %s\n" "$nombre"
printf "Edad: %d años\n" "$edad"
printf "Salario: $%.2f\n" "$salario"

# Tabla formateada
printf "%-15s %-10s %-10s\n" "NOMBRE" "EDAD" "CIUDAD"
printf "%-15s %-10d %-10s\n" "Ana" 28 "Lima"
printf "%-15s %-10d %-10s\n" "Carlos" 35 "Bogotá"
printf "%-15s %-10d %-10s\n" "María" 22 "Madrid"

# Padding con ceros
printf "Número: %05d\n" 42

read — Leer entrada del usuario

#!/bin/bash

# Lectura básica
echo "¿Cómo te llamás?"
read nombre
echo "¡Hola, $nombre!"

# Lectura con prompt en la misma línea
read -p "Ingresá tu edad: " edad
echo "Tenés $edad años"

# Lectura silenciosa (para contraseñas)
read -sp "Ingresá tu contraseña: " password
echo ""
echo "Contraseña guardada (longitud: ${#password})"

# Lectura con timeout (5 segundos)
read -t 5 -p "Tenés 5 segundos para responder: " respuesta
echo ""

# Lectura con límite de caracteres
read -n 1 -p "¿Continuar? (s/n): " opcion
echo ""

# Leer múltiples valores
read -p "Ingresá 3 colores separados por espacio: " color1 color2 color3
echo "Color 1: $color1"
echo "Color 2: $color2"
echo "Color 3: $color3"

Redirección de salida

#!/bin/bash

# Redirigir stdout a un archivo (sobrescribir)
echo "Primera línea" > archivo.txt

# Redirigir stdout a un archivo (agregar)
echo "Segunda línea" >> archivo.txt

# Redirigir stderr a un archivo
ls /directorio_inexistente 2> errores.log

# Redirigir stdout y stderr al mismo archivo
comando_cualquiera &> todo.log

# Redirigir stdout y stderr por separado
ls /tmp /inexistente 1> salida.txt 2> errores.txt

# Descartar salida (enviar a /dev/null)
echo "Esto no se verá" > /dev/null
ls /inexistente 2>/dev/null

Redirección de entrada

#!/bin/bash

# Leer desde un archivo
while read linea; do
echo "Leído: $linea"
done < archivo.txt

# Here Document (bloque de texto)
cat << EOF
Esto es un bloque de texto.
Puede tener múltiples líneas.
Las variables se expanden: $USER
EOF

# Here Document sin expandir variables
cat << 'EOF'
Aquí $USER no se expande
Ni $(date) tampoco
EOF

# Here String
grep "hola" <<< "hola mundo"

Pipes (tuberías)

#!/bin/bash

# El pipe (|) conecta la salida de un comando con la entrada de otro

# Contar archivos en un directorio
ls -1 /tmp | wc -l

# Buscar proceso específico
ps aux | grep bash

# Ordenar y eliminar duplicados
echo -e "banana\nmanzana\nbanana\npera\nmanzana" | sort | uniq

# Cadena de pipes
cat /etc/passwd | grep "/bin/bash" | cut -d: -f1 | sort

# Pipe con tee (escribir a archivo Y mostrar en pantalla)
echo "Log de ejemplo" | tee log.txt
ls -la | tee listado.txt | head -5

Ejemplo práctico: Registro de usuario

#!/bin/bash
# registro.sh - Formulario de registro interactivo

echo "======================================"
echo " FORMULARIO DE REGISTRO"
echo "======================================"

read -p "Nombre completo: " nombre
read -p "Email: " email
read -p "Edad: " edad
read -sp "Contraseña: " password
echo ""
read -n 1 -p "¿Confirmar registro? (s/n): " confirmacion
echo ""

if [[ "$confirmacion" == "s" ]]; then
echo ""
echo "======================================"
echo " DATOS REGISTRADOS"
echo "======================================"
printf "%-15s: %s\n" "Nombre" "$nombre"
printf "%-15s: %s\n" "Email" "$email"
printf "%-15s: %d\n" "Edad" "$edad"
printf "%-15s: %s\n" "Contraseña" "********"
echo "======================================"

# Guardar en archivo (sin contraseña)
echo "$nombre,$email,$edad" >> registros.csv
echo "Datos guardados en registros.csv"
else
echo "Registro cancelado."
fi

Ejemplo práctico: Logger simple

#!/bin/bash
# logger.sh - Sistema de logging básico

LOG_FILE="app.log"

log_info() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [INFO] $1" | tee -a "$LOG_FILE"
}

log_warn() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [WARN] $1" | tee -a "$LOG_FILE"
}

log_error() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [ERROR] $1" | tee -a "$LOG_FILE" >&2
}

# Uso
log_info "Aplicación iniciada"
log_info "Conectando a la base de datos..."
log_warn "La conexión tardó más de lo esperado"
log_info "Conexión exitosa"
log_error "Error al procesar solicitud #42"
log_info "Aplicación finalizada"

echo ""
echo "--- Contenido del log ---"
cat "$LOG_FILE"

Ejercicios

  1. Creá un script que pida nombre, apellido y edad, y genere un resumen formateado con printf
  2. Creá un script que lea un archivo línea por línea y muestre cada línea numerada
  3. Usando pipes, contá cuántos archivos .sh hay en un directorio