15%

Ahorra 15%<\/span> en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código:

Skills
Comenzar
29.10.2024
2 +1

Escribir Scripts en Linux Bash: Una Guía Completa para Principiantes y Administradores de Sistemas

El scripting en Bash es una de las habilidades más poderosas que puede desarrollar un usuario de Linux, desarrollador o administrador de sistemas. Ya sea que estés gestionando un solo servidor u orquestando flujos de trabajo automatizados complejos en toda una infraestructura, dominar el scripting en Bash reduce drásticamente el esfuerzo manual, minimiza el error humano y desbloquea todo el potencial de tu entorno Linux.

En esta guía completa, te explicaremos todo lo que necesitas saber sobre la escritura de scripts en Bash — desde la creación de tu primer archivo hasta el trabajo con variables, condicionales, bucles, funciones, argumentos y técnicas de depuración. Se incluyen ejemplos prácticos listos para copiar y pegar a lo largo de todo el contenido.

¿Qué es un Script de Bash?

Un script de Bash es un archivo de texto plano que contiene una secuencia ordenada de comandos interpretados y ejecutados por el shell Bash (Bourne Again SHell). Bash es el shell interactivo predeterminado en la gran mayoría de las distribuciones de Linux, lo que lo hace universalmente disponible e inmediatamente práctico.

En lugar de escribir la misma secuencia de comandos repetidamente en una terminal, los escribes una vez dentro de un archivo de script y lo ejecutas a demanda — o lo programas para que se ejecute automáticamente.

Casos de Uso Comunes para Scripts de Bash

  • Gestión de archivos — copiar, mover, renombrar, archivar y eliminar archivos en masa
  • Administración de sistemas — monitorear procesos, gestionar usuarios, verificar el uso del disco
  • Automatización de software — instalar paquetes, configurar servicios, desplegar aplicaciones
  • Copia de seguridad y recuperación — crear copias de seguridad programadas, incrementales o completas del sistema
  • Análisis y reporte de registros — filtrar y resumir datos de registros para su análisis
  • Aprovisionamiento de servidores — automatizar la configuración inicial de un nuevo entorno de VPS Hosting o servidor dedicado

Requisitos Previos

Para seguir esta guía, necesitas:

  • Un sistema Linux (máquina local, VM o servidor remoto)
  • Acceso a la terminal con una cuenta de usuario (privilegios de root o sudo para algunas operaciones)
  • Familiaridad básica con la línea de comandos de Linux

Si estás trabajando en un servidor remoto, los planes de VPS Hosting de AlexHost te ofrecen acceso SSH completo como root, lo que los hace ideales para practicar y desplegar scripts de Bash en un entorno real.

Paso 1: Crear un Archivo de Script de Bash

Abre tu terminal y usa cualquier editor de texto para crear un nuevo archivo con la extensión .sh. La extensión .sh es una convención ampliamente adoptada que indica que el archivo es un script de shell, aunque técnicamente no es requerida por el intérprete.

nano myscript.sh

Puedes sustituir nano por vim, gedit, micro, o cualquier otro editor que prefieras.

Paso 2: Añadir la Línea Shebang (#!)

La primera línea de cada script de Bash debe ser el shebang — una directiva especial que le indica al sistema operativo qué intérprete usar al ejecutar el archivo.

#!/bin/bash

Esta línea instruye al kernel para que pase el script a /bin/bash para su ejecución, independientemente del shell que el usuario actual tenga configurado como predeterminado. Inclúyela siempre — omitir el shebang puede causar que los scripts se comporten de manera impredecible en diferentes entornos.

> Consejo: En algunos sistemas modernos, también puedes ver #!/usr/bin/env bash, que es una alternativa más portable que localiza el binario de Bash dinámicamente a través del PATH.

Paso 3: Escribir tus Comandos

Después del shebang, añade los comandos que deseas que ejecute el script. Aquí tienes un ejemplo sencillo que saluda al usuario actual y muestra información útil del sistema:

#!/bin/bash

# A simple script to greet the user and display system info
echo "Hello, $USER! Welcome back."
echo "Today's date and time: $(date)"
echo "Your current working directory: $(pwd)"
echo "System hostname: $(hostname)"

Explicación de los Elementos Clave

ElementoDescripción
echoImprime texto o valores de variables en la terminal (salida estándar)
$USERUna variable de entorno integrada que contiene el nombre de usuario actual
$(date)Sustitución de comandos — ejecuta date e inserta su salida en línea
$(pwd)Inserta la ruta del directorio de trabajo actual
$(hostname)Inserta el nombre de host del sistema
#Inicia un comentario — ignorado por el intérprete, usado para documentación

Paso 4: Hacer el Script Ejecutable

Antes de poder ejecutar el script directamente, debes otorgarle permisos de ejecución usando el comando chmod:

chmod +x myscript.sh

Esto establece el bit de ejecución para el propietario del archivo. Para verificar que los permisos se aplicaron correctamente, ejecuta:

ls -l myscript.sh

Deberías ver algo como -rwxr-xr-x, donde los caracteres x confirman el permiso de ejecución.

Paso 5: Ejecutar el Script

Ejecuta el script desde el mismo directorio usando la siguiente sintaxis:

./myscript.sh

El prefijo ./ le indica al shell que busque el archivo en el directorio actual en lugar de buscar en el PATH del sistema. Deberías ver la salida impresa directamente en tu terminal.

Alternativamente, puedes invocarlo explícitamente con el intérprete:

bash myscript.sh

Variables en Scripts de Bash

Las variables te permiten almacenar y reutilizar datos a lo largo de tu script. Pueden contener cadenas de texto, enteros, rutas de archivos o la salida de comandos.

Definir y Usar Variables

#!/bin/bash

# Define variables
server_name="web-server-01"
max_connections=500
backup_dir="/var/backups"

# Use variables
echo "Server: $server_name"
echo "Max connections allowed: $max_connections"
echo "Backup directory: $backup_dir"

Reglas Importantes para las Variables

  • Sin espacios alrededor del signo = al asignar un valor (name="value" es correcto; name = "value" no lo es)
  • Añade el prefijo $ al nombre de la variable al leer su valor: $variable_name
  • Usa llaves para mayor claridad en cadenas complejas: ${variable_name}
  • Los nombres de variables son sensibles a mayúsculas y minúsculas: $Name y $name son variables diferentes

Capturar la Salida de un Comando en una Variable

#!/bin/bash

current_date=$(date +"%Y-%m-%d")
disk_usage=$(df -h / | awk 'NR==2 {print $5}')

echo "Date: $current_date"
echo "Root partition usage: $disk_usage"

Sentencias Condicionales en Bash

La lógica condicional permite que tu script tome decisiones y ejecute diferentes rutas de código según las condiciones evaluadas.

Estructura Básica if / elif / else

#!/bin/bash

echo "Enter a number between 1 and 100:"
read user_input

if [ "$user_input" -ge 1 ] && [ "$user_input" -le 50 ]; then
    echo "Your number is in the lower half (1–50)."
elif [ "$user_input" -ge 51 ] && [ "$user_input" -le 100 ]; then
    echo "Your number is in the upper half (51–100)."
else
    echo "Your number is outside the valid range."
fi

Operadores de Comparación Comunes

OperadorSignificado
-eqIgual a
-neDistinto de
-gtMayor que
-ltMenor que
-geMayor o igual que
-leMenor o igual que
-zLa cadena está vacía
-nLa cadena no está vacía
-fEl archivo existe y es un archivo regular
-dEl directorio existe

Verificar si un Archivo Existe

#!/bin/bash

config_file="/etc/nginx/nginx.conf"

if [ -f "$config_file" ]; then
    echo "Configuration file found: $config_file"
else
    echo "ERROR: Configuration file not found at $config_file"
    exit 1
fi

Bucles en Scripts de Bash

Los bucles te permiten repetir un bloque de comandos varias veces, ya sea sobre un rango definido, una lista de elementos o hasta que una condición cambie.

Bucle for — Iterando sobre un Rango

#!/bin/bash

echo "Counting from 1 to 5:"
for i in {1..5}; do
    echo "  Iteration: $i"
done

Bucle for — Iterando sobre una Lista de Elementos

#!/bin/bash

servers=("web-01" "web-02" "db-01" "cache-01")

for server in "${servers[@]}"; do
    echo "Pinging server: $server"
    ping -c 1 "$server" &>/dev/null && echo "  ✔ $server is reachable" || echo "  ✘ $server is unreachable"
done

Bucle while — Ejecutándose hasta que una Condición sea Falsa

#!/bin/bash

counter=1

while [ $counter -le 5 ]; do
    echo "Counter value: $counter"
    counter=$((counter + 1))
done

echo "Loop complete."

Bucle until — Ejecutándose hasta que una Condición se Vuelva Verdadera

#!/bin/bash

attempts=0

until [ $attempts -ge 3 ]; do
    echo "Attempt $((attempts + 1))..."
    attempts=$((attempts + 1))
done

echo "Maximum attempts reached."

Funciones en Scripts de Bash

Las funciones te permiten encapsular bloques reutilizables de lógica, haciendo que tus scripts sean más limpios, modulares y fáciles de mantener — especialmente a medida que crecen en complejidad.

Definir y Llamar a una Función

#!/bin/bash

# Define the function
greet_user() {
    local username="$1"
    echo "Hello, $username! Your session started at $(date +"%H:%M:%S")."
}

# Call the function with arguments
greet_user "Alice"
greet_user "Bob"

Una Función Práctica: Verificar el Estado de un Servicio

#!/bin/bash

check_service() {
    local service_name="$1"
    if systemctl is-active --quiet "$service_name"; then
        echo "✔ $service_name is running."
    else
        echo "✘ $service_name is NOT running. Attempting to start..."
        systemctl start "$service_name" && echo "  Started successfully." || echo "  Failed to start $service_name."
    fi
}

check_service "nginx"
check_service "mysql"
check_service "ssh"

> Nota: La palabra clave local restringe el alcance de una variable al interior de la función, evitando efectos secundarios no deseados en scripts más grandes.

Trabajar con Argumentos de Línea de Comandos

Los scripts de Bash pueden aceptar entradas directamente desde la línea de comandos cuando se invocan, lo que permite crear scripts flexibles y reutilizables que se comportan de manera diferente según los parámetros proporcionados.

Variables Especiales de Argumentos

VariableDescripción
$0El nombre del script en sí
$1, $2, $3El primer, segundo y tercer argumento posicional
$#El número total de argumentos pasados
$@Todos los argumentos como una lista
$*Todos los argumentos como una sola cadena
$?El código de salida del último comando ejecutado

Ejemplo: Un Script que Acepta Argumentos

#!/bin/bash

# Validate that exactly two arguments were provided
if [ $# -ne 2 ]; then
    echo "Usage: $0 <source_directory> <destination_directory>"
    exit 1
fi

source_dir="$1"
dest_dir="$2"

# Check that the source directory exists
if [ ! -d "$source_dir" ]; then
    echo "ERROR: Source directory '$source_dir' does not exist."
    exit 1
fi

echo "Copying files from '$source_dir' to '$dest_dir'..."
cp -r "$source_dir" "$dest_dir" && echo "Copy completed successfully." || echo "Copy failed."

Ejecútalo así:

./myscript.sh /var/www/html /var/backups/html_backup

Códigos de Salida y Manejo de Errores

Los scripts de Bash robustos siempre manejan los errores de forma adecuada. Cada comando en Linux devuelve un código de salida: 0 indica éxito, y cualquier valor distinto de cero indica un error.

Usar exit y $?

#!/bin/bash

# Attempt to create a directory
mkdir /tmp/test_directory

if [ $? -eq 0 ]; then
    echo "Directory created successfully."
else
    echo "Failed to create directory."
    exit 1
fi

Usar set -e para el Manejo Automático de Errores

Añadir set -e al inicio de tu script hace que se cierre inmediatamente si algún comando devuelve un código de salida distinto de cero — una buena práctica para scripts en producción:

#!/bin/bash
set -e          # Exit on any error
set -u          # Treat unset variables as errors
set -o pipefail # Catch errors in pipelines

echo "Starting deployment..."
cd /var/www/html
git pull origin main
systemctl reload nginx
echo "Deployment complete."

Depuración de Scripts de Bash

Incluso los desarrolladores experimentados escriben scripts con errores. Bash proporciona herramientas integradas para ayudarte a rastrear y solucionar problemas de manera eficiente.

Método 1: Ejecutar con el Flag -x (Modo de Rastreo)

bash -x myscript.sh

Esto imprime cada comando en la terminal a medida que se ejecuta, con el prefijo +, junto con los valores de las variables expandidas. Es la técnica de depuración más utilizada.

Método 2: Añadir set -x dentro del Script

Puedes habilitar y deshabilitar el rastreo para secciones específicas de tu script:

#!/bin/bash

echo "Normal execution..."

set -x  # Enable tracing
cp /source/file /destination/
chmod 644 /destination/file
set +x  # Disable tracing

echo "Tracing disabled again."

Método 3: Usar Sentencias echo como Puntos de Control

Las sentencias echo colocadas estratégicamente te ayudan a verificar los valores de las variables y confirmar que la ejecución ha alcanzado un punto específico del script:

echo "DEBUG: backup_dir = $backup_dir"
echo "DEBUG: Reached checkpoint before rsync"

Ejemplo Práctico del Mundo Real: Script de Copia de Seguridad Automatizada

Aquí tienes un script de Bash completo y listo para producción que demuestra muchos de los conceptos tratados en esta guía:

#!/bin/bash
set -euo pipefail

# ============================================================
# Automated Backup Script
# Description: Backs up a specified directory with a timestamp
# ============================================================

# Configuration
SOURCE_DIR="/var/www/html"
BACKUP_ROOT="/var/backups/web"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_NAME="backup_${TIMESTAMP}.tar.gz"
BACKUP_PATH="${BACKUP_ROOT}/${BACKUP_NAME}"
RETENTION_DAYS=7
LOG_FILE="/var/log/backup.log"

# Logging function
log() {
    echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE"
}

# Validate source directory
if [ ! -d "$SOURCE_DIR" ]; then
    log "ERROR: Source directory '$SOURCE_DIR' not found. Aborting."
    exit 1
fi

# Create backup root if it doesn't exist
mkdir -p "$BACKUP_ROOT"

log "Starting backup of '$SOURCE_DIR'..."

# Create compressed archive
tar -czf "$BACKUP_PATH" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")"

log "Backup created: $BACKUP_PATH ($(du -sh "$BACKUP_PATH" | cut -f1))"

# Remove backups older than retention period
log "Removing backups older than ${RETENTION_DAYS} days..."
find "$BACKUP_ROOT" -name "backup_*.tar.gz" -mtime +"$RETENTION_DAYS" -delete

log "Backup process completed successfully."

Este tipo de script es invaluable en cualquier servidor de producción. Si estás ejecutando un sitio web o aplicación en Servidores Dedicados o un VPS, automatizar tus copias de seguridad con un script como este — combinado con un trabajo cron — garantiza que tus datos estén siempre protegidos sin intervención manual.

Programar Scripts de Bash con Cron

Para ejecutar tus scripts de Bash automáticamente según un horario, usa cron, el programador de tareas de Linux. Edita tu crontab con:

crontab -e

Añade una línea en el siguiente formato:

# Run backup script every day at 2:00 AM
0 2 * * * /path/to/backup.sh >> /var/log/backup_cron.log 2>&1

Sintaxis de Cron: minute hour day-of-month month day-of-week command

Buenas Prácticas para Escribir Scripts de Bash

Seguir estas convenciones hará que tus scripts sean más confiables, legibles y fáciles de mantener:

  1. Incluye siempre el shebang (#!/bin/bash) en la primera línea
  2. Usa set -euo pipefail en scripts de producción para detectar errores temprano
  3. Pon tus variables entre comillas ("$variable") para evitar problemas de división de palabras y globbing
  4. Usa nombres de variables significativosbackup_directory es más claro que bd
  5. Comenta tu código — explica el *por qué*, no solo el *qué*
  6. Valida las entradas — verifica que los argumentos y archivos requeridos existan antes de continuar
  7. Usa funciones para organizar la lógica compleja en bloques reutilizables y con nombre
  8. Prueba en un entorno seguro antes de ejecutar scripts en sistemas de producción
  9. Usa variables local dentro de las funciones para evitar contaminar el ámbito global
  10. Registra las acciones importantes en un archivo para poder auditar el comportamiento del script más adelante

Llevar tus Habilidades en Bash al Siguiente Nivel

Una vez que te sientas cómodo con los fundamentos, considera explorar estos temas avanzados:

  • Expresiones regulares con grep, sed y awk para el procesamiento avanzado de texto
  • Documentos here (heredoc) para incrustar cadenas multilínea en scripts
  • Sustitución de procesos y tuberías con nombre para pipelines de datos complejos
  • Manejo de señales con trap para la terminación controlada de scripts
  • Arrays asociativos (Bash 4+) para estructuras de datos clave-valor
  • Bibliotecas de scripts — importar funciones comunes desde un archivo compartido con source

Si estás gestionando aplicaciones web, bases de datos o infraestructura de correo electrónico, el scripting en Bash se combina naturalmente con servicios como Hosting Web Compartido para proyectos más pequeños, o un VPS con cPanel totalmente gestionado para entornos donde deseas una interfaz gráfica junto con acceso al shell.

Para equipos que ejecutan cargas de trabajo intensivas en datos o pipelines de aprendizaje automático, los scripts de Bash son igualmente valiosos para orquestar trabajos en infraestructura de GPU Hosting — automatizando ejecuciones de entrenamiento de modelos, gestionando conjuntos de datos y manejando la configuración del entorno.

Conclusión

El scripting en Bash es una habilidad indispensable para cualquier persona que trabaje con Linux — ya seas un principiante automatizando tu primera tarea repetitiva o un administrador de sistemas senior gestionando infraestructura de servidores compleja. Los conceptos tratados en esta guía — creación de archivos, variables, condicionales, bucles, funciones, manejo de argumentos, gestión de errores y depuración — forman la base completa que necesitas para escribir scripts confiables y de calidad para producción.

Empieza con algo pequeño: automatiza una tarea que realizas manualmente cada día. A medida que crezca tu confianza, combina estos bloques de construcción en herramientas cada vez más sofisticadas que ahorren horas de trabajo, reduzcan el riesgo de error humano y te den un control preciso y repetible sobre tus sistemas.

Para el mejor entorno donde practicar y desplegar tus scripts de Bash, explora la gama de planes de VPS Hosting basados en Linux de AlexHost — con acceso root completo, almacenamiento SSD y configuraciones flexibles diseñadas para desarrolladores y administradores de sistemas.

15%

Ahorra 15%<\/span> en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código:

Skills
Comenzar