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')