Una guía completa desde los conceptos más básicos
Bash (Bourne Again SHell) es un programa que interpreta comandos, es decir, un intérprete de comandos o shell. Es la interfaz que permite a los usuarios interactuar con el sistema operativo escribiendo comandos.
Bash es el shell predeterminado en la mayoría de distribuciones Linux y en macOS (hasta la versión Catalina). Es una mejora del shell original sh (Bourne Shell) creado por Stephen Bourne.
💡 Consejo: Aunque al principio Bash pueda parecer intimidante, con práctica descubrirás que es una herramienta extremadamente poderosa que te permite automatizar tareas y tener un control preciso sobre tu sistema.
Para empezar a usar Bash, necesitas abrir una terminal o consola:
$ echo "Hola Mundo"
Hola Mundo
El símbolo $
representa el prompt, donde escribes los comandos. No necesitas escribirlo tú, aparece automáticamente.
El comando echo
simplemente muestra el texto que le indiques.
Comando | Descripción | Ejemplo |
---|---|---|
pwd |
Muestra el directorio actual (Print Working Directory) | $ pwd |
ls |
Lista archivos y directorios | $ ls |
cd |
Cambia de directorio (Change Directory) | $ cd Documentos |
mkdir |
Crea un nuevo directorio | $ mkdir Proyectos |
touch |
Crea un archivo vacío | $ touch archivo.txt |
📌 Nota: En Bash, los comandos y nombres de archivos son sensibles a mayúsculas y minúsculas. Archivo.txt
y archivo.txt
son considerados archivos diferentes.
Un script de Bash es un archivo de texto que contiene una serie de comandos que Bash puede ejecutar secuencialmente. Los scripts permiten automatizar tareas repetitivas.
Los scripts de Bash suelen tener la extensión .sh
, aunque esto no es obligatorio.
#!/bin/bash
# Este es un comentario
# Script de ejemplo
echo "Hola Mundo"
Vamos a analizar cada parte:
#!/bin/bash
): Indica qué intérprete debe ejecutar el script. Más detalles abajo.#
): Líneas que Bash ignora, sirven para documentar el script.echo "Hola Mundo"
.La primera línea de un script (que comienza con #!
) se llama shebang (también conocido como hashbang). Le dice al sistema qué intérprete debe usar para ejecutar el script.
#!/bin/bash
específicamente le dice al sistema que use Bash para interpretar el script.
📌 ¿Por qué es importante? Sin el shebang, el sistema no sabría cómo ejecutar tu script. Aunque en muchos sistemas Bash es el shell predeterminado, es una buena práctica incluirlo siempre.
# 1. Crear el archivo (puedes usar nano, vim o tu editor favorito)
nano hola_mundo.sh
# 2. Dar permisos de ejecución
chmod +x hola_mundo.sh
# 3. Ejecutar el script
./hola_mundo.sh
Explicación paso a paso:
chmod +x
para hacer el archivo ejecutable../
antes del nombre (esto le dice a Bash que busque el script en el directorio actual).⚠️ Importante: Si intentas ejecutar el script sin ./
(solo escribiendo hola_mundo.sh
), Bash buscará el comando en tus directorios de sistema (como /bin, /usr/bin) y no lo encontrará.
# Esto es un comentario de una línea
: '
Este es un comentario
de múltiples líneas
en Bash
'
Los comentarios son importantes para documentar tu código y explicar qué hace cada parte. Bash ignora todo lo que esté después de #
en una línea.
nombre="Juan"
edad=25
echo "Hola $nombre, tienes $edad años"
En Bash, las variables se crean simplemente asignando un valor. Algunas reglas:
=
$
antes del nombreecho "¿Cómo te llamas?"
read nombre
echo "Hola $nombre, bienvenido!"
El comando read
pide al usuario que introduzca un valor y lo guarda en una variable.
echo "¿Cuál es tu edad?"
read edad
if [ $edad -ge 18 ]; then
echo "Eres mayor de edad"
else
echo "Eres menor de edad"
fi
Este es un ejemplo básico de una estructura condicional. Observa:
if [ condición ]; then ... fi
-ge
significa "greater or equal" (mayor o igual)[ ]
son obligatoriosEn Bash, todas las variables son esencialmente cadenas de texto, pero se pueden usar de diferentes maneras:
Tipo | Ejemplo | Descripción |
---|---|---|
Cadenas | nombre="Ana" |
Texto entre comillas |
Números | contador=10 |
Se tratan como cadenas pero se pueden usar en operaciones aritméticas |
Arrays | frutas=("manzana" "banana" "naranja") |
Listas de valores |
Bash tiene varias variables predefinidas que son muy útiles:
Variable | Descripción |
---|---|
$0 |
Nombre del script |
$1, $2, ... $9 |
Argumentos pasados al script |
$# |
Número de argumentos |
$? |
Código de salida del último comando (0 = éxito) |
$$ |
PID (ID de proceso) del script actual |
#!/bin/bash
echo "Nombre del script: $0"
echo "Primer argumento: $1"
echo "Número de argumentos: $#"
💡 Consejo: Prueba el script anterior pasándole diferentes argumentos: ./script.sh arg1 arg2 arg3
Aunque Bash es el shell más popular, existen otras alternativas con diferentes características:
Shell | Descripción | Ventajas |
---|---|---|
sh (Bourne Shell) | El shell original | Más ligero, estándar POSIX |
zsh | Z Shell | Autocompletado mejorado, temas, plugins (ahora es el shell predeterminado en macOS) |
fish | Friendly Interactive Shell | Sintaxis más simple, colores, autosugerencias |
ksh | Korn Shell | Compatible con scripts sh, con mejoras |
📌 Nota: La mayoría de scripts escritos para Bash funcionarán en otros shells, pero algunos comandos avanzados pueden comportarse diferente. Para máxima compatibilidad, usa #!/bin/sh
en lugar de #!/bin/bash
en tus scripts.
# Ver qué shells están instalados
cat /etc/shells
# Ver tu shell actual
echo $SHELL
# Cambiar a zsh (por ejemplo)
chsh -s $(which zsh)
⚠️ Precaución: No cambies tu shell sin entender las implicaciones. Algunos sistemas dependen de que el shell predeterminado sea Bash.
#!/bin/bash
# Pide el nombre al usuario y saluda
echo -n "¿Cómo te llamas? "
read nombre
if [ -z "$nombre" ]; then
echo "No me dijiste tu nombre :("
else
echo "¡Hola $nombre! Bienvenido al mundo de Bash"
fi
Características:
echo -n
muestra el texto sin salto de línea al final[ -z "$nombre" ]
verifica si la variable está vacía#!/bin/bash
# Crea una copia de seguridad de un directorio
# Variables
origen="$HOME/Documentos"
destino="$HOME/Backups/documentos_$(date +%Y%m%d).tar.gz"
# Crear el backup
tar -czf "$destino" "$origen" 2>/dev/null
# Verificar si funcionó
if [ $? -eq 0 ]; then
echo "Backup creado en $destino"
else
echo "Error al crear el backup" >&2
fi
Este script demuestra:
$(date +%Y%m%d)
)tar
$?
2>/dev/null
)💡 Reto: Modifica el script para que verifique si el directorio de origen existe antes de intentar hacer el backup.