BASH es obligatorio si eres (o no) DevOps

Tags: #devops#backend#work#linux

SGT911 - 2/20/2025


Imagen del blog: BASH es obligatorio si eres (o no) DevOps

Como desarrolladores y gente vinculada al mundo TI ya hemos tocado o en su momento interactuaremos con algun sistema basado en Linux desde como desarrollador empezando con Ubuntu pasando por Fedora, RHEL (en entornos empresariales) o SLE. O tambien como SysAdmin o DevOps con sistemas mas enfocados a entornos de produccion o sistemas Enterprise como lo es Amazon Linux, Azure Linux, F-cos o RH-cos.

Esto nos obligara a interactuar con alguna terminal o shell por media general esa terminal por defecto sera BASH (Bourne-Again SHell) con algunos leves cambios dependiendo la terminal que utilizemos pero a final de cuentas sera BASH. Esto es importante para nosotros ya que basicamente como usuarios de un sistema basado en Linux y siendo poco menos que un estandar para la industria Informatica (quitando un par de excepciones), hoy en dia es imprescindible tener un conocimiento basico sobre el uso de la terminal (ademas de comandos especificos segun la distribucion que uses) y sumamente recomendado indagar mas en conceptos un poco mas avanzados de esta herramienta, que pese a que la lleguemos a utilizar diariamente damos por sentado sus caracteristicas a la hora de hacer ciertas tareas las cuales con un par de comandos extras.

BASH 101, Guia para dummies (y no tanto)

Hay que entender como tema fundamental que BASH ademas de ser una interfaz para interactuar con el sistema operativo con comandos como cd, ls, entre otros, BASH posee muchas herramientas built-in y otras extendidas por el sistema operativo para poder tener un lenguaje de scripting completo en su gran mayoria permitiendo automatizar tareas que sean repetitivas o que requieran hacer una cierta cantidad de operaciones.

Esto nos lleva a aprender varias caracteristicas de BASH las cuales son escenciales para el scripting como lo es: variables, condicionales, bucles, funciones, importaciones, alias, entre otros.

Variables

Las variables en BASH son fundamentales para el scripting, hay que tener en cuenta que todas las variables en bash se trataran de forma inicial como un texto (string), en caso de necesitar hacer operaciones aritmeticas o de formato hay funciones externas que te permitiran hacer esto que ya veremos mas adelante. Existen diferentes tipos y formas de declararlas:

# Todas las variables se tratan como texto
nombre="Juan"
edad=25

# Variables de entorno
export MI_VARIABLE="valor"

# Variable de contexto local
local variable_local=20

# Variables especiales
$0  # Nombre del script
$1, $2, $3  # Argumentos posicionales
$#  # Número de argumentos
$?  # Código de salida del último comando

Tambien hay que tener en cuenta que las variables te permite tener varias operaciones que te pueden servir y ser imporatente a la hora de trabajar con variables con formatos especificos o que requiren algun tratamiento especifico.

# Ejecución con $()
fecha=$(date +%Y-%m-%d)
archivos=$(ls -1 | wc -l)

# Ejecución con backticks (legacy, mejor usar $())
usuario=`whoami`

# Valores por defecto
nombre=${1:-"Usuario"}  # Si $1 no existe, usa "Usuario"
puerto=${PORT:=3000}    # Asigna 3000 si PORT no existe

# Validación de variables
: ${API_KEY:?"API_KEY es requerida"}  # Error si API_KEY no existe

# Sustitución de valores
mensaje=${saludo/hola/adios}  # Reemplaza "hola" por "adios"
texto=${mensaje//a/A}         # Reemplaza todas las "a" por "A"

Condicionales

Los condicionales nos permiten tomar decisiones en nuestros scripts:

if [ "$edad" -gt 18 ]; then # '-gt' significa '>'
    echo "Es mayor de edad"
elif [ "$edad" -eq 18 ]; then # '-eq' significa '=='
    echo "Justo tiene 18"
else
    echo "Es menor de edad"
fi

# Comparación de strings
if [ "$nombre" = "Juan" ]; then
    echo "Hola Juan!"
fi

case $rol in
    Admin)
        echo "Acceso completo"
        ;;

    User)
        echo "Acceso de solo lectura"
        ;;

    # Cualquier caso no contemplado
    *)
        echo "Sin acceso"
        ;;
esac

Bucles

BASH ofrece varios tipos de bucles para iterar sobre datos:

# For tradicional
for i in {1..5}; do
    echo "Número: $i"
done

# While
contador=0
while [ $contador -lt 5 ]; do
    echo "Contador: $contador"
    ((contador++))
done

# For con arrays
nombres=("Juan" "Pedro" "María")
for nombre in "${nombres[@]}"; do
    echo "Hola $nombre"
done

Funciones

Las funciones nos ayudan a organizar y reutilizar código:

function saludar() {
    local nombre="$1"
    echo "¡Hola $nombre!"
}

# Llamada a la función
saludar "María"

importaciones

Con las importaciones nos permite en conjunto con las funciones a generar un codigo mas organizado y extensible:

# Usando source
source ./lib/funciones.sh

# O usando el alias punto
. ./lib/funciones.sh

# También puedes usar rutas absolutas
source "/ruta/absoluta/config.sh"

Ejemplos y ejercicios

Ya teniendo en cuenta las componentes claves los cuales constituyen a un Script en BASH podemos empezar a automatizar distintas tareas que nos pueden ser de utilidad en nuestro dia a dia como desarrolladores o DevOps.

Hay que tener en cuenta que estods ejemplos se remontan principalmente a tareas para el mantenimiento de un servidor o tareas principalmente para gestionar archivos.

Ejemplos

Ejemplo 1: Script para hacer un backup de una base de datos MySQL.

#!/bin/bash

MYSQL_HOST="localhost"
MYSQL_USER="root"
MYSQL_PASS="${1}"
MYSQL_DB="${2:-app}"

: ${MYSQL_PASS:?"Se requiere la contraseña de MySQL"}

BACKUP_PATH="$(mktemp --suffix=.sql)"

# Crear backup
mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" "-p$MYSQL_PASS" "$MYSQL_DB" > "$BACKUP_PATH"

# Comprimir
gzip -9 "$BACKUP_PATH"
BACKUP_PATH="${BACKUP_PATH}.gz"

DATE="$(date +%Y-%m-%d)"

# Mover a carpeta de backups
mv "$BACKUP_PATH" "/mnt/backups/${MYSQL_DB}_${DATE}.sql.gz"