Manual Completo de Programación en Bash: Comandos y Scripts

Estructura Básica y Símbolos Fundamentales

  • #!/bin/bash (Shebang): Es obligatoriamente la primera línea de cualquier script. Le dice al sistema operativo qué programa debe usar para ejecutar el código (en este caso, el intérprete Bash).
  • # (Comentario): Todo lo que escribas después de un # en esa línea será ignorado por el sistema. Sirve para dejar notas y explicaciones humanas.
  • var="texto" (Asignación de variable): Crea una variable llamada var y le guarda un dato. Importante: No debe haber espacios antes ni después del signo =.
  • $var (Llamada a variable): El símbolo del dólar $ sirve para «leer» lo que hay dentro de una variable. Si var=5, escribir $var es como escribir 5.
  • " " (Comillas dobles): Permiten agrupar texto y, además, el sistema «traduce» las variables que haya dentro. Ejemplo: "Hola $nombre".
  • ' ' (Comillas simples): Agrupan texto pero de forma estricta. Todo es texto literal. Si escribes 'Hola $nombre', literalmente imprimirá por pantalla la palabra $nombre, no el valor de la variable.

Entrada y Salida de Datos (I/O)

  • echo: Imprime texto por pantalla con un salto de línea al final.
  • echo -n: Imprime texto pero sin salto de línea al final (el cursor se queda en la misma línea).
  • echo -e: Permite usar caracteres especiales de escape dentro del texto, como \n para forzar un salto de línea manual.
  • read: Pausa el script y espera a que el usuario escriba algo por teclado y pulse Intro.
  • read -p "Mensaje:" var: La opción -p (prompt) permite mostrar un texto por pantalla y guardar lo que escriba el usuario directamente en la variable var en una sola línea.

Estructuras de Control: Condicionales

  • if [ condición ]; then: Inicia un bloque condicional. Significa «Si esta condición se cumple, entonces haz lo siguiente…».
  • elif [ condición ]; then: Significa «Else If» (O si no, si…). Sirve para encadenar múltiples comprobaciones si la primera falló.
  • else: Significa «Si no…». Es el bloque que se ejecuta si ninguna de las condiciones anteriores del if o elif se cumplieron.
  • fi: Cierra el bloque condicional if (es «if» escrito al revés).
  • case $variable in: Inicia una estructura de opciones múltiples. Analiza el contenido de $variable.
  • 1) / 2) / texto): Son los «casos» del case. Si la variable vale 1, entra en 1).
  • | (Tubería lógica en case): Funciona como un «O». Ejemplo: 1|2|3) significa «Si es 1, o 2, o 3».
  • *): En un case, significa «Cualquier otra cosa que no haya coincidido con los casos anteriores» (opción por defecto).
  • ;;: Indica el final de las instrucciones de un caso específico dentro de un case.
  • esac: Cierra el bloque case (es «case» escrito al revés).

Estructuras de Control: Bucles

  • while [ condición ]; do: Inicia un bucle «Mientras». El código se repetirá una y otra vez mientras la condición sea verdadera.
  • for variable in lista; do: Inicia un bucle «Para». Recorre una lista de elementos uno por uno.
  • for i in {1..5}; do: Variante del for que cuenta desde el número 1 hasta el 5.
  • done: Cierra el bloque de un bucle (tanto para while como para for). Significa «hecho» o «fin de esta vuelta».
  • break: Rompe y finaliza un bucle inmediatamente, saltando fuera de él.
  • continue: Salta el resto del código de la vuelta actual del bucle y pasa directamente a la siguiente vuelta.
  • true: Un comando que siempre devuelve éxito. Se usa en while true; do para crear bucles infinitos.

Operadores de Comprobación (Tests)

Se usan dentro de los corchetes [ ] o dobles corchetes [[ ]].

Operadores Numéricos

OperadorSignificado
-eqEqual (Igual a)
-neNot Equal (Distinto)
-gtGreater Than (Mayor que)
-ltLess Than (Menor que)
-geGreater or Equal (Mayor o igual que)
-leLess or Equal (Menor o igual que)

Operadores de Texto/Cadenas

  • = o ==: Las dos cadenas de texto son idénticas.
  • !=: Las cadenas de texto son distintas.
  • -z: (Zero length). Devuelve verdad si la variable está vacía.
  • -n: (Not zero). Devuelve verdad si la variable tiene texto (no está vacía).
  • =~: Comprueba si el texto coincide con una Expresión Regular (se usa con [[ ]]).

Operadores de Ficheros/Directorios

  • -d: (Directory). Comprueba si la ruta existe y es un directorio.
  • -f: (File). Comprueba si la ruta existe y es un fichero normal.
  • -x: (eXecutable). Comprueba si el fichero tiene permisos de ejecución.

Operador Lógico

  • && (AND): «Y». Ejemplo: [ a -gt 1 ] && [ a -lt 5 ] (Si ‘a’ es mayor que 1 Y menor que 5).

Operadores Aritméticos y Fórmulas

  • ((...)) (Expansión aritmética): Todo lo que vaya dentro de los dobles paréntesis se calcula matemáticamente. Ejemplo: suma=$((2 + 3)).
  • +, -, *, /: Suma, resta, multiplicación y división entera (Bash no maneja decimales por defecto).
  • % (Módulo): Devuelve el resto de una división.
  • ++ / --: Incrementa o reduce el valor en 1.
  • += y -=: Suma o resta un valor a la variable actual.
  • expr: Comando antiguo para matemáticas.

Variables Especiales del Sistema

  • $?: Código de resultado del último comando (0 = éxito).
  • $#: Número total de parámetros pasados al script.
  • $@: Todos los parámetros pasados al script.
  • $1, $2...: Parámetros en posición específica.
  • $RANDOM: Número aleatorio entre 0 y 32767.
  • $USER: Nombre del usuario actual.
  • $HOME: Ruta de la carpeta personal.

Funciones y Palabras Clave Avanzadas

  • nombre_funcion() { ... }: Crea un bloque de código reutilizable.
  • local var="algo": Variable que solo existe dentro de la función.
  • eval: Ejecuta un texto como si fuera un comando de Bash.
  • [a-zA-Z]+: Expresión regular para validar solo letras.

Redirecciones y Tuberías

  • >: Redirección de salida (sobrescribe).
  • >>: Redirección de añadir (no borra).
  • <: Redirección de entrada.
  • | (Pipe): Pasa la salida de un comando como entrada al siguiente.
  • 2>/dev/null: Envía los errores a un «agujero negro».

Comandos de Linux Utilizados

clear, sleep, exit, ping, touch, mkdir, mv, cp, rm, ls, cat, cut, grep, head, sort, find, du, tar, date, getent.

Ejemplo de Script Maestro

#!/bin/bash
# =========================================================================
# SCRIPT MAESTRO: RECOPILACIÓN DE TODA LA CHULETA BASH
# =========================================================================

carpeta_test="$HOME/laboratorio_chuleta"
fichero_log="$carpeta_test/registro.txt"

clear
echo -e "==========================\nINICIANDO SISTEMA MAESTRO\n=========================="
echo -n "Comprobando parámetros... "

if [ $# -eq 0 ] || [ -z "$1" ]; then
    usuario_script="$USER"
    echo "Ningún parámetro. Usando: $usuario_script"
else
    usuario_script="$1"
    echo "Parámetros recibidos ($@). Usando: $usuario_script"
fi

sleep 1

if [ ! -d "$carpeta_test" ]; then
    mkdir -p "$carpeta_test"
fi

date +%F > "$fichero_log"
getent passwd "$USER" | cut -d: -f5 >> "$fichero_log"

echo "Haciendo ping a internet..."
ping -c 1 8.8.8.8 > /dev/null 2>/dev/null

if [ $? -eq 0 ]; then
    echo "¡Conexión a Internet OK!" >> "$fichero_log"
else
    echo "Sin conexión a Internet." >> "$fichero_log"
fi

pedir_apodo() {
    local temp_apodo
    while true; do
        read -p "Introduce un apodo para jugar (solo letras): " temp_apodo
        if [[ "$temp_apodo" =~ ^[a-zA-Z]+$ ]]; then
            eval "$1=\$temp_apodo"
            break
        else
            echo "Error. Vuelve a intentarlo."
        fi
    done
}

jugar=true
puntos=0
while [ "$jugar" = true ]; do
    echo -e "\nHola '$apodo_jugador'. ¿Qué quieres hacer?"
    echo "1. Crear ficheros de prueba y comprimirlos"
    echo "2. Minijuego de sumas"
    echo "3. Leer registro y salir"
    read -p "Opción: " opcion
    case $opcion in
        1) 
            for i in {1..5}; do touch "$carpeta_test/archivo_$i.txt"; done
            cp "$carpeta_test/archivo_1.txt" "$carpeta_test/copia.txt"
            mv "$carpeta_test/archivo_2.txt" "$carpeta_test/movido.txt"
            tar -czf "$carpeta_test/backup.tgz" "$carpeta_test" 2>/dev/null
            du -h "$carpeta_test" | head -n 1
            ;;
        2|M|m)
            n1=$((RANDOM % 10 + 1))
            n2=$((RANDOM % 10 + 1))
            resultado_antiguo=$(expr $n1 + $n2)
            read -p "¿Cuánto es $n1 + $n2? " resp
            if [ "$resp" -eq "$resultado_antiguo" ]; then
                echo "¡Correcto!"
                ((puntos++))
            else
                echo "Fallo."
                ((puntos--))
            fi
            ;;
        3|*)
            echo "Tus puntos finales: $puntos"
            while read -r linea; do echo "-> $linea"; done < "$fichero_log"
            read -p "¿Borrar la carpeta de pruebas? (s/n): " borrar
            if [ "$borrar" = "s" ]; then rm -rf "$carpeta_test"; fi
            jugar=false
            ;;
    esac
done
exit 0

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.