Programación Shell: Ejemplos Prácticos de Bash y Utilidades Linux Esenciales

Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 8,18 KB

Introducción a la Programación Shell y Utilidades de Línea de Comandos

Este documento presenta una colección de scripts Bash y ejemplos de comandos fundamentales de Linux, ideales para comprender la automatización y el manejo de datos en entornos de terminal. Exploraremos desde la lógica de control de flujo en Bash hasta el uso avanzado de herramientas como awk y grep.

Simulador de Estaciones de Tren en Bash

Este script simula un sistema de navegación por estaciones de tren. Permite al usuario avanzar (S/s), retroceder (A/a) o reiniciar (R/r) la posición, y muestra la estación actual. Al presionar 'E' o 'e', se emite un mensaje de desalojo.

#!/bin/bash
pos=0
while true; do
    read tecla

    if [[ $tecla == S ]] || [[ $tecla == s ]]; then
        if [[ $pos -le 4 ]]; then
            pos=$(($pos + 1))
        fi
    fi

    if [[ $tecla == A ]] || [[ $tecla == a ]]; then
        if [[ $pos -gt 0 ]]; then
            pos=$(($pos - 1))
        fi
    fi

    if [[ $tecla == r ]] || [[ $tecla == R ]]; then
        pos=0
    fi

    if [[ $tecla == e ]] || [[ $tecla == E ]]; then
        echo "Desalojen el tren de forma tranquila"
    else
        if [[ $pos == 0 ]]; then
            echo "Terminal"
        elif [[ $pos == 1 ]]; then
            echo "Estación Sants"
        elif [[ $pos == 2 ]]; then
            echo "Estación Gracia"
        elif [[ $pos == 3 ]]; then
            echo "Estación Clot"
        else
            echo "Estación Andreu"
        fi
    fi
done

Operaciones Básicas y Comandos Esenciales en Bash

Esta sección detalla ejemplos prácticos de operaciones aritméticas, bucles y redirecciones de entrada/salida, junto con el uso de comandos clave como shuf, awk y grep para el procesamiento de texto.

Operaciones Aritméticas y Bucles

  • Suma de variables: $(($var+$val))
  • Bucle for: Itera sobre un rango de números.
    for i in {1..10}; do
        echo $i
    done
    

    La variable i toma el valor de los números del 1 al 10.

Redirección de Entrada/Salida

  • Sobrescribir archivo: echo "texto" > archivo.txt.
  • Añadir al final: echo "texto" >> archivo.txt.
  • >>: Añade al final del archivo.
  • >: Sobreescribe el archivo.
  • <: Para leer línea a línea (redirección de entrada).

Generación de Números Aleatorios

El comando shuf permite generar números aleatorios o mezclar líneas de un archivo.

shuf -i 1-100 -n 1

Este comando genera un número aleatorio entre 1 y 100.

Uso de AWK para Procesamiento de Texto

awk es una potente herramienta para el procesamiento de texto y la manipulación de datos estructurados.

  • Sintaxis básica: awk 'patrón {acciones}' archivo
  • Filtrar líneas por contenido:
    awk '/error/ {print $0}' archivo.txt
    

    Muestra las líneas que contienen 'error'.

  • Filtrar líneas a partir de una posición:
    awk 'NR > 2 {print $0}' archivo.txt
    

    Muestra las líneas a partir de la tercera línea en adelante (NR es el número de registro/línea).

  • Filtrado condicional avanzado:
    awk '$2 ~ /error/ && $3 > 100 {print $1, $3}' archivo.txt
    

    Imprime la primera ($1) y tercera ($3) columnas si la segunda columna ($2) contiene "error" y la tercera columna ($3) es mayor que 100.

Uso de GREP para Búsqueda de Patrones

grep es una herramienta fundamental para buscar patrones de texto dentro de archivos.

  • Buscar líneas que contienen un patrón:
    grep "error" archivo.txt
    

    Muestra las líneas que contienen 'error'.

  • Buscar palabras completas:
    grep -w "clave" archivo.txt
    

    Busca "clave" como palabra completa (ej. encuentra "clave" pero no "clave123").

  • Excluir líneas con un patrón:
    grep -v "error" archivo.txt
    

    Muestra las líneas que no contienen "error".

  • Buscar líneas que empiezan con un patrón:
    grep "^inicio" archivo.txt
    

    Muestra las líneas que empiezan con "inicio".

  • Combinar grep y awk:
    grep "error" archivo.txt | awk '{print $2}'
    

    Busca líneas con "error" y muestra solo la segunda columna de esas líneas.

Script de Selección de Programas

Este script demuestra cómo usar condicionales y bucles para procesar un archivo (programas) basándose en la entrada del usuario. Permite filtrar líneas específicas de un archivo.

if [[ $opcion -eq 1 ]]; then
    grep "a" programas
fi

if [[ $opcion -eq 2 ]]; then
    echo "¿Qué programa quieres? suave, lana, rápido, color"
    read prog
    var=0
    if [[ $prog == suave ]]; then
        while read -r line; do
            ((var++))
            if [[ $var -gt 2 && $var -lt 7 ]]; then # Imprime líneas de la 3 a la 6 (índice 2 a 6)
                echo $line
            fi
        done < programas
    fi
fi

Juego de Adivinanza en Bash

Un sencillo juego donde el usuario debe adivinar un número aleatorio generado por el script. El script proporciona pistas indicando si el número a adivinar es mayor o menor.

aleatorio=$(shuf -i 0-100 -n 1)

echo "Dame un número"
read numero

while [[ $numero -ne $aleatorio ]]; do
    if [[ $numero -gt $aleatorio ]]; then
        echo "El número es más pequeño"
        read numero
    elif [[ $numero -lt $aleatorio ]]; then
        echo "El número es más grande"
        read numero
    elif [[ $numero -eq $aleatorio ]]; then
        echo "¡Has acertado!"
    fi
done

if [[ $numero -eq $aleatorio ]]; then
    echo "¡Has acertado!"
fi

Sistema Básico de Gestión de Clientes de Gimnasio

Este script simula un sistema rudimentario para gestionar clientes de un gimnasio, permitiendo la matrícula de nuevos usuarios, un control de acceso básico y la visualización de un panel de control.

#!/bin/bash
echo "a. Matrícula nueva"
echo "b. Control de acceso"
echo "c. Panel de control"
archivo=clientes.txt
read opcion
nombre=0
edad=0
dni=0
idgym=0
pagook=0
fecha=0

if [[ $opcion == a ]]; then
    echo "Rellena los siguientes campos:"
    echo "Dame tu DNI"
    read dni
    if grep -q "$dni" "$archivo"; then
        echo "Ya estás dado de alta."
        return
    fi
    echo "Dame tu edad"
    read edad
    echo "Dame tu nombre"
    read nombre
    idgym=$((RANDOM % 999))
    pagook=1
    fecha=00000000
    echo "$nombre-$edad-$dni-$idgym-$pagook-$fecha" >> $archivo
    echo "¡Bien! Tu ID de gimnasio es $idgym"
fi

if [[ $opcion == b ]]; then
    echo "Dame tu ID"
    read idgym
    verificar=$(awk -F '-' '{print $4}' "clientes.txt")
    if [ -z "$verificar" ]; then
        echo "Cadena vacía (archivo de clientes vacío o IDs no encontrados)."
    else
        echo "Estás verificado (ID encontrado en el archivo)."
    fi
fi

if [[ $opcion == c ]]; then
    while [[ $var -eq 0 ]]; do
        awk -F '-' '{print $1 " " $5}' "$archivo"
        sleep 4
        awk '$2 == 0 {print $1 $3}' "$archivo"
        sleep 4
    done
fi

Nota sobre el script de gestión de clientes: La lógica de verificación de acceso (opción 'b') y el filtrado en el panel de control (opción 'c') son simplificados y podrían requerir mejoras para un sistema real. Por ejemplo, la opción 'b' verifica si el archivo de clientes tiene IDs, no si el ID introducido por el usuario existe. La opción 'c' filtra por edad 0, lo cual podría ser un marcador de estado o un error tipográfico en el original.

Entradas relacionadas: