Guía práctica y comandos esenciales para Bash Scripting

Comentarios en Shell

Para incluir comentarios de una sola línea, se utiliza el carácter #. Para bloques de varias líneas, se puede emplear la redirección de entrada nula:

: << 'BLOQUE_COMENTARIO'
Todo lo que se encuentre aquí
será ignorado por el intérprete.
BLOQUE_COMENTARIO

Verificación de existencia de archivos

Es fundamental validar si un archivo existe antes de manipularlo para evitar errores en tiempo de ejecución:

if [ -f "/ruta/al/archivo.log" ]; then 
    echo "El archivo existe, procediendo a eliminarlo..."
    rm "/ruta/al/archivo.log"
fi

Finalización de la ejecución

Para detener un script y devolver un código de estado (útil para depuración o encadenamiento de comandos), usa exit:

exit 1 # Indica una terminación con error

Buenas prácticas con variables

Se recomienda rodear siempre el nombre de las variables con llaves ${} para evitar ambigüedades, especialmente al concatenar cadenas:

NOMBRE_APP="servidor"
echo "Iniciando el ${NOMBRE_APP}_backup.sh"

Integración con Python

Cuando la lógica de Shell se vuelve compleja, puedes delegar tareas a scripts de Python directamente:

python3 procesar_datos.py

Comparaciones numéricas y de cadenas

Existen operadores específicos según el tipo de dato:

  • Para números: -eq (igual), -ne (distinto), -gt (mayor que).
  • Para cadenas: == o !=.

Operadores lógicos

Puedes combinar condiciones utilizando:

  • AND: && o -a
  • OR: || o -o

Validación de parámetros de entrada

Para verificar si un argumento obligatorio no ha sido proporcionado al script:

if [[ -z "$1" ]]; then
    echo "Error: Se requiere al menos un argumento."
    exit 1
fi

Ejecución remota vía SSH

Para automatziar comandos remotos que requieren contraseña sin interacción manual, se puede usar sshpass:

HOST_IP="10.0.0.15"
REMOTE_USER="admin"
PASS="secreto123"

sshpass -p ${PASS} ssh ${REMOTE_USER}@${HOST_IP} "uptime; df -h"

También se pueden enviar múltiples líneas mediante un here-document:

ssh user@remote_host << 'EOF'
    cd /tmp
    touch test_file.txt
    exit
EOF

Automatización con Expect

Para interactuar con programas que solicitan datos de forma interactiva (como cambios de contraseña), expect es la herramienta ideal:

expect << 'DONE'
spawn passwd usuario
expect "Nueva contraseña:"
send "Pass123\r"
expect "Vuelva a escribir la nueva contraseña:"
send "Pass123\r"
expect eof
DONE

Uso del comando yes

El comando yes genera una cadena repetitiva (por defecto "y") para responder afirmativamente a prompts interactivos:

# Responder 'y' automáticamente a todas las confirmaciones de borrado
yes | rm -i *.temp

Aplicación de parches con diff y patch

Proceso para actualizar archivos de configuración mediante diferencias:

# Generar el parche
diff -u config_original.conf config_modificado.conf > cambios.patch

# Aplicar el parche
patch config_original.conf cambios.patch

Transferencia de archivos con SCP

Envío de archivos a un servidor remoto utilizando credenciales automáticas:

sshpass -p ${MI_PASS} scp ./local.txt ${USUARIO}@${IP}:/home/datos/

Sudo con entrada de cotnraseña automática

Si necesitas ejecutar un comando con privilegios elevados dentro de un flujo automatizado:

echo "contraseña_root" | sudo -S systemctl restart nginx

Manejo de Arreglos (Arrays)

Definición y acceso a elementos de una lista:

servidores=("web01" "web02" "db01")

# Agregar elemento
servidores[3]="cache01"

# Acceder a todos los elementos
echo "Lista completa: ${servidores[@]}"

# Contar elementos
echo "Total: ${#servidores[*]}"

Iteración de arreglos

for servidor in "${servidores[@]}"; do
    echo "Conectando a: $servidor"
done

Conversión de cadenas a arreglos

Es posible dividir una cadena basada en espacios para convertirla en un array:

LISTA_TEXTO="rojo verde azul"
COLORES=($LISTA_TEXTO)
echo "El segundo color es: ${COLORES[1]}"

Procesamiento de JSON con jq

Para extraer valores de archivos JSON, jq es el estándar:

# Extraer un valor simple
ID=$(cat data.json | jq -r '.id')

# Extraer elementos de una lista y limpiar comillas con sed
MODULOS=$(cat info.json | jq '.plugins[]' | sed 's/\"//g')

Búsqueda avanzada con find

Limitar la profundidad de búsqueda y filtrar por tipo de archivo:

# Buscar directorios hasta un nivel 2 de profundidad
find /var/log -maxdepth 2 -type d

Manipulación de texto con sed

Reemplazo global de patrones en una cadena o archivo:

# Cambiar todas las instancias de 'http' por 'https'
URL_LIMPIA=$(echo "http://sitio.com" | sed 's/http/https/g')

Etiquetas: bash shell-scripting linux automation jq

Publicado el 7-24 14:22