Variables en Bash

Variables - Frieren sacando objetos de su bolsa mágica

Las variables son contenedores para guardar información. Son fundamentales en cualquier lenguaje de programación, incluyendo Bash.


¿Qué es una Variable?

Una variable es un nombre que apunta a un valor:

┌─────────────┐
│  nombre     │ ──────► "Juan"
└─────────────┘

┌─────────────┐
│  edad       │ ──────► 25
└─────────────┘

┌─────────────┐
│  directorio │ ──────► "/home/usuario"
└─────────────┘

Crear Variables (Asignación)

Sintaxis: NOMBRE=valor

# Texto
nombre="Juan"
mensaje="Hola mundo"

# Números
edad=25
contador=0

# Rutas
directorio="/home/usuario/proyectos"

REGLA CRÍTICA: Sin Espacios

# CORRECTO - sin espacios alrededor del =
nombre="Juan"

# INCORRECTO - Bash interpreta "nombre" como un comando
nombre = "Juan"
# Error: nombre: command not found

nombre= "Juan"
# Error

nombre ="Juan"
# Error

Ejecuta en tu terminal:

# Crea estas variables
mi_nombre="Tu Nombre Aquí"
mi_edad=20
mi_lenguaje="Python"

# Verifica que existen (no producen output, eso es normal)

Leer Variables: $VAR y ${VAR}

Para usar el valor de una variable, necesitas el símbolo $:

nombre="Juan"

# Leer la variable
echo $nombre
# Juan

echo "Hola, $nombre"
# Hola, Juan

$VAR vs ${VAR} - ¿Cuál usar?

Ambos funcionan, pero ${VAR} es más seguro:

archivo="documento"

# $VAR funciona aquí
echo $archivo
# documento

# Pero falla si quieres agregar texto
echo "$archivo_backup"
# (vacío - Bash busca variable "archivo_backup")

# ${VAR} resuelve el problema
echo "${archivo}_backup"
# documento_backup

Regla Simple

Situación Usar Ejemplo
Variable sola $VAR echo $nombre
Variable + texto ${VAR} echo "${nombre}_copia"
Dentro de comillas ${VAR} echo "Hola ${nombre}"
En duda ${VAR} Siempre funciona
# Crea una variable
fruta="manzana"

# Prueba estas variaciones
echo $fruta
echo ${fruta}
echo "${fruta}s"         # manzanas
echo "$frutas"           # ¿Qué pasa? (vacío)
echo "${fruta}s"         # manzanas (correcto)

# Más ejemplos
prefijo="archivo"
echo "${prefijo}_001.txt"
echo "${prefijo}_002.txt"

Comillas: Simples vs Dobles (MUY IMPORTANTE)

Esta es una de las fuentes de errores más comunes en Bash.

Comillas Dobles "..." - Variables SÍ se expanden

nombre="María"

echo "Hola, $nombre"
# Hola, María

echo "Tu home es $HOME"
# Tu home es /home/usuario

Comillas Simples '...' - Variables NO se expanden

nombre="María"

echo 'Hola, $nombre'
# Hola, $nombre  (literal, no expande)

echo 'Tu home es $HOME'
# Tu home es $HOME  (literal)

Tabla Comparativa

Comillas Variables Caracteres especiales Usar para
"dobles" Se expanden Algunos se interpretan Texto con variables
'simples' NO se expanden Se imprimen literal Texto literal exacto
Sin comillas Se expanden Se interpretan Variables simples
nombre="Carlos"
ruta="/home/$nombre"

# Predice el resultado antes de ejecutar
echo "Dobles: $nombre"
echo 'Simples: $nombre'

echo "Ruta con dobles: $ruta"
echo 'Ruta con simples: $ruta'

# ¿Cuál es la diferencia?

Variables Especiales de Bash

Bash tiene variables predefinidas con información útil:

Variable Contenido
$USER Tu nombre de usuario
$HOME Tu directorio home
$PWD Directorio actual
$SHELL Tu shell
$? Código de salida del último comando
$$ PID del proceso actual
echo "Usuario: $USER"
echo "Home: $HOME"
echo "Directorio actual: $PWD"
echo "Mi shell: $SHELL"
# Ejecuta cada línea y observa
echo "Soy $USER"
echo "Mi home está en $HOME"
echo "Estoy en $PWD"
echo "Mi proceso es $$"

# El código de salida
ls /tmp
echo "Código de salida: $?"

ls /directorio_que_no_existe
echo "Código de salida: $?"
# ¿Qué diferencia hay?

Concatenar Variables

Puedes combinar variables y texto:

nombre="Juan"
apellido="Pérez"

# Concatenar
nombre_completo="$nombre $apellido"
echo $nombre_completo
# Juan Pérez

# Con más texto
saludo="Hola, $nombre_completo, bienvenido"
echo $saludo
# Hola, Juan Pérez, bienvenido

# Construir rutas
usuario="maria"
ruta_proyecto="/home/${usuario}/proyectos/nuevo"
echo $ruta_proyecto
# /home/maria/proyectos/nuevo
# Define variables
nombre="Ada"
lenguaje="Python"
años_exp=5

# Construye un mensaje (usa estas variables)
mensaje="$nombre programa en $lenguaje y tiene $años_exp años de experiencia"
echo $mensaje

# Construye una ruta
base="/home"
usuario="ada"
proyecto="ml_model"
ruta_completa="${base}/${usuario}/proyectos/${proyecto}"
echo $ruta_completa

Eliminar Variables: unset

mi_variable="algo"
echo $mi_variable
# algo

unset mi_variable
echo $mi_variable
# (vacío)

Ver Todas las Variables

# Ver todas las variables del shell
set | head -20

# Ver solo variables de entorno
env | head -20

Errores Comunes

1. Espacios en la asignación

# MAL
nombre = "Juan"
# bash: nombre: command not found

# BIEN
nombre="Juan"

2. Olvidar el $

nombre="Juan"

# MAL - imprime la palabra "nombre"
echo nombre
# nombre

# BIEN
echo $nombre
# Juan

3. Confundir comillas

var="mundo"

# Comillas dobles - expande
echo "Hola $var"   # Hola mundo

# Comillas simples - NO expande
echo 'Hola $var'   # Hola $var

4. Variable pegada a texto

archivo="foto"

# MAL - busca variable "archivobak"
echo "$archivobak"
# (vacío)

# BIEN - usa llaves
echo "${archivo}bak"
# fotobak

Ejercicios Integrales

Crea variables con tu información y genera una “tarjeta”:

# Tu información
nombre="Tu Nombre"
ocupacion="Estudiante"
universidad="ITAM"
semestre=5
hobby="programar"

# Genera la tarjeta
echo "================================"
echo "  TARJETA DE PRESENTACIÓN"
echo "================================"
echo "Nombre: $nombre"
echo "Ocupación: $ocupacion"
echo "Universidad: $universidad"
echo "Semestre: $semestre"
echo "Hobby: $hobby"
echo "================================"
# Variables base
usuario=$(whoami)
fecha=$(date +%Y-%m-%d)
proyecto="analisis"

# Construye rutas
ruta_home="/home/${usuario}"
ruta_backup="${ruta_home}/backups/${fecha}"
ruta_proyecto="${ruta_home}/proyectos/${proyecto}"

# Muestra las rutas
echo "Home: $ruta_home"
echo "Backup: $ruta_backup"
echo "Proyecto: $ruta_proyecto"
# Datos
precio_unitario=150
cantidad=5
descuento=10

# Cálculos
subtotal=$((precio_unitario * cantidad))
descuento_valor=$((subtotal * descuento / 100))
total=$((subtotal - descuento_valor))

# Factura
echo "=== FACTURA ==="
echo "Precio unitario: \$$precio_unitario"
echo "Cantidad: $cantidad"
echo "Subtotal: \$$subtotal"
echo "Descuento ($descuento%): -\$$descuento_valor"
echo "TOTAL: \$$total"

Resumen

Concepto Sintaxis Ejemplo
Crear variable VAR=valor nombre="Juan"
Leer variable $VAR o ${VAR} echo $nombre
Con texto ${VAR}texto echo "${nombre}_backup"
Comillas dobles "$VAR" Expande variables
Comillas simples '$VAR' NO expande (literal)
Eliminar unset VAR unset nombre

Siguiente: Ahora veremos las variables de entorno - variables especiales que configuran tu sistema.