Expansiones, comillas y comodines en Bash
🎯 Objetivo del módulo Entender cómo Bash transforma una línea antes de ejecutar el comando y aprender a trabajar con variables, espacios y grupos de archivos sin provocar resultados inesperados.
1. La shell expande antes de ejecutar #
Bash interpreta ciertos caracteres antes de llamar al programa. Entre otras operaciones, expande variables, sustituye comandos, divide palabras y resuelve patrones de nombres de archivo.
1echo "$HOME" 2echo "Hoy es $(date +%F)" 3ls *.txt
El comando final recibe el resultado de esas expansiones, no siempre el texto que escribiste literalmente.
2. Comodines de nombres de archivo #
| Patrón | Coincide con |
|---|---|
* | cero o más caracteres |
? | exactamente un carácter |
[abc] | uno de los caracteres indicados |
[0-9] | un carácter dentro del rango |
1ls *.log 2ls foto?.jpg 3ls informe[0-9].txt
Los patrones los expande Bash usando los archivos existentes. No son expresiones regulares.
Archivos ocultos #
* no incluye normalmente nombres que comienzan por .. Debes indicarlos explícitamente o usar opciones específicas del comando.
1ls .*.conf 2ls -A
Si un patrón no encuentra coincidencias, Bash suele dejarlo sin modificar. Revisa siempre el resultado antes de combinar comodines con rm, mv o chmod.
3. Comillas simples y dobles #
Comillas simples #
Conservan el contenido literalmente. No expanden variables ni sustituciones de comandos.
1echo '$HOME'
Salida:
1$HOME
Comillas dobles #
Conservan espacios y evitan la expansión de comodines, pero permiten expandir variables y $(...).
1nombre='Ana López' 2echo "Hola, $nombre"
Regla práctica: entrecomilla las expansiones de variables salvo que necesites deliberadamente división de palabras o expansión de patrones.
1cp -- "$origen" "$destino"
-- indica a muchos comandos que los argumentos siguientes ya no son opciones. Es útil si un nombre empieza por -.
4. Escape con barra inversa #
La barra inversa elimina el significado especial del carácter siguiente.
1echo \$HOME 2touch archivo\ con\ espacios.txt
Para rutas completas suele resultar más legible usar comillas:
1touch "archivo con espacios.txt"
5. Sustitución de comandos #
$(comando) ejecuta un comando y coloca su salida en la línea actual, eliminando los saltos de línea finales.
1hoy=$(date +%F) 2archivo="backup-$hoy.tar.gz" 3echo "$archivo"
La forma $(...) es más legible y fácil de anidar que las comillas invertidas antiguas.
6. Expansiones útiles #
Valor predeterminado #
1echo "${EDITOR:-nano}"
Usa nano si EDITOR no existe o está vacía, sin modificar la variable.
Llaves para delimitar el nombre #
1usuario='ana' 2echo "${usuario}_backup"
Expansión aritmética #
1contador=4 2echo $((contador + 1))
7. Errores comunes #
- No entrecomillar una ruta almacenada en una variable.
- Confundir comodines con expresiones regulares.
- Suponer que
*incluye archivos ocultos. - Ejecutar una operación destructiva sin inspeccionar antes qué expande el patrón.
- Usar
echo $variablecuando el contenido debe conservar exactamente sus espacios.
8. Buenas prácticas #
1printf '%s\n' "$variable" 2printf 'Archivo: %s\n' "$ruta"
- Usa
printfcuando necesites una salida predecible. - Escribe
"$variable"para conservar cada valor como un único argumento. - Prueba primero los patrones con
printf '%s\n' patrónols. - Usa
--cuando un comando lo admita y los nombres puedan comenzar por guion.
Resumen del tema
*,?y[]son patrones de nombres de archivo que Bash expande antes de ejecutar el comando.- Las comillas simples conservan todo literalmente; las dobles permiten variables y sustituciones sin dividir el resultado en palabras.
$(comando)captura la salida de un comando.- Entrecomillar variables evita muchos errores con espacios y caracteres especiales.