Estructura Básica y Símbolos Fundamentales
#!/bin/bash(Shebang): Es obligatoriamente la primera línea de cualquier script. Le dice al sistema operativo qué programa debe usar para ejecutar el código (en este caso, el intérprete Bash).#(Comentario): Todo lo que escribas después de un#en esa línea será ignorado por el sistema. Sirve para dejar notas y explicaciones humanas.var="texto"(Asignación de variable): Crea una variable llamadavary le guarda un dato. Importante: No debe haber espacios antes ni después del signo=.$var(Llamada a variable): El símbolo del dólar$sirve para «leer» lo que hay dentro de una variable. Sivar=5, escribir$vares como escribir 5." "(Comillas dobles): Permiten agrupar texto y, además, el sistema «traduce» las variables que haya dentro. Ejemplo:"Hola $nombre".' '(Comillas simples): Agrupan texto pero de forma estricta. Todo es texto literal. Si escribes'Hola $nombre', literalmente imprimirá por pantalla la palabra$nombre, no el valor de la variable.
Entrada y Salida de Datos (I/O)
echo: Imprime texto por pantalla con un salto de línea al final.echo -n: Imprime texto pero sin salto de línea al final (el cursor se queda en la misma línea).echo -e: Permite usar caracteres especiales de escape dentro del texto, como\npara forzar un salto de línea manual.read: Pausa el script y espera a que el usuario escriba algo por teclado y pulse Intro.read -p "Mensaje:" var: La opción-p(prompt) permite mostrar un texto por pantalla y guardar lo que escriba el usuario directamente en la variablevaren una sola línea.
Estructuras de Control: Condicionales
if [ condición ]; then: Inicia un bloque condicional. Significa «Si esta condición se cumple, entonces haz lo siguiente…».elif [ condición ]; then: Significa «Else If» (O si no, si…). Sirve para encadenar múltiples comprobaciones si la primera falló.else: Significa «Si no…». Es el bloque que se ejecuta si ninguna de las condiciones anteriores delifoelifse cumplieron.fi: Cierra el bloque condicionalif(es «if» escrito al revés).case $variable in: Inicia una estructura de opciones múltiples. Analiza el contenido de$variable.1) / 2) / texto): Son los «casos» delcase. Si la variable vale 1, entra en1).|(Tubería lógica en case): Funciona como un «O». Ejemplo:1|2|3)significa «Si es 1, o 2, o 3».*): En uncase, significa «Cualquier otra cosa que no haya coincidido con los casos anteriores» (opción por defecto).;;: Indica el final de las instrucciones de un caso específico dentro de uncase.esac: Cierra el bloquecase(es «case» escrito al revés).
Estructuras de Control: Bucles
while [ condición ]; do: Inicia un bucle «Mientras». El código se repetirá una y otra vez mientras la condición sea verdadera.for variable in lista; do: Inicia un bucle «Para». Recorre una lista de elementos uno por uno.for i in {1..5}; do: Variante delforque cuenta desde el número 1 hasta el 5.done: Cierra el bloque de un bucle (tanto parawhilecomo parafor). Significa «hecho» o «fin de esta vuelta».break: Rompe y finaliza un bucle inmediatamente, saltando fuera de él.continue: Salta el resto del código de la vuelta actual del bucle y pasa directamente a la siguiente vuelta.true: Un comando que siempre devuelve éxito. Se usa enwhile true; dopara crear bucles infinitos.
Operadores de Comprobación (Tests)
Se usan dentro de los corchetes [ ] o dobles corchetes [[ ]].
Operadores Numéricos
| Operador | Significado |
|---|---|
| -eq | Equal (Igual a) |
| -ne | Not Equal (Distinto) |
| -gt | Greater Than (Mayor que) |
| -lt | Less Than (Menor que) |
| -ge | Greater or Equal (Mayor o igual que) |
| -le | Less or Equal (Menor o igual que) |
Operadores de Texto/Cadenas
= o ==: Las dos cadenas de texto son idénticas.!=: Las cadenas de texto son distintas.-z: (Zero length). Devuelve verdad si la variable está vacía.-n: (Not zero). Devuelve verdad si la variable tiene texto (no está vacía).=~: Comprueba si el texto coincide con una Expresión Regular (se usa con[[ ]]).
Operadores de Ficheros/Directorios
-d: (Directory). Comprueba si la ruta existe y es un directorio.-f: (File). Comprueba si la ruta existe y es un fichero normal.-x: (eXecutable). Comprueba si el fichero tiene permisos de ejecución.
Operador Lógico
&&(AND): «Y». Ejemplo:[ a -gt 1 ] && [ a -lt 5 ](Si ‘a’ es mayor que 1 Y menor que 5).
Operadores Aritméticos y Fórmulas
((...))(Expansión aritmética): Todo lo que vaya dentro de los dobles paréntesis se calcula matemáticamente. Ejemplo:suma=$((2 + 3)).+, -, *, /: Suma, resta, multiplicación y división entera (Bash no maneja decimales por defecto).%(Módulo): Devuelve el resto de una división.++ / --: Incrementa o reduce el valor en 1.+= y -=: Suma o resta un valor a la variable actual.expr: Comando antiguo para matemáticas.
Variables Especiales del Sistema
$?: Código de resultado del último comando (0 = éxito).$#: Número total de parámetros pasados al script.$@: Todos los parámetros pasados al script.$1, $2...: Parámetros en posición específica.$RANDOM: Número aleatorio entre 0 y 32767.$USER: Nombre del usuario actual.$HOME: Ruta de la carpeta personal.
Funciones y Palabras Clave Avanzadas
nombre_funcion() { ... }: Crea un bloque de código reutilizable.local var="algo": Variable que solo existe dentro de la función.eval: Ejecuta un texto como si fuera un comando de Bash.[a-zA-Z]+: Expresión regular para validar solo letras.
Redirecciones y Tuberías
>: Redirección de salida (sobrescribe).>>: Redirección de añadir (no borra).<: Redirección de entrada.|(Pipe): Pasa la salida de un comando como entrada al siguiente.2>/dev/null: Envía los errores a un «agujero negro».
Comandos de Linux Utilizados
clear, sleep, exit, ping, touch, mkdir, mv, cp, rm, ls, cat, cut, grep, head, sort, find, du, tar, date, getent.
Ejemplo de Script Maestro
#!/bin/bash
# =========================================================================
# SCRIPT MAESTRO: RECOPILACIÓN DE TODA LA CHULETA BASH
# =========================================================================
carpeta_test="$HOME/laboratorio_chuleta"
fichero_log="$carpeta_test/registro.txt"
clear
echo -e "==========================\nINICIANDO SISTEMA MAESTRO\n=========================="
echo -n "Comprobando parámetros... "
if [ $# -eq 0 ] || [ -z "$1" ]; then
usuario_script="$USER"
echo "Ningún parámetro. Usando: $usuario_script"
else
usuario_script="$1"
echo "Parámetros recibidos ($@). Usando: $usuario_script"
fi
sleep 1
if [ ! -d "$carpeta_test" ]; then
mkdir -p "$carpeta_test"
fi
date +%F > "$fichero_log"
getent passwd "$USER" | cut -d: -f5 >> "$fichero_log"
echo "Haciendo ping a internet..."
ping -c 1 8.8.8.8 > /dev/null 2>/dev/null
if [ $? -eq 0 ]; then
echo "¡Conexión a Internet OK!" >> "$fichero_log"
else
echo "Sin conexión a Internet." >> "$fichero_log"
fi
pedir_apodo() {
local temp_apodo
while true; do
read -p "Introduce un apodo para jugar (solo letras): " temp_apodo
if [[ "$temp_apodo" =~ ^[a-zA-Z]+$ ]]; then
eval "$1=\$temp_apodo"
break
else
echo "Error. Vuelve a intentarlo."
fi
done
}
jugar=true
puntos=0
while [ "$jugar" = true ]; do
echo -e "\nHola '$apodo_jugador'. ¿Qué quieres hacer?"
echo "1. Crear ficheros de prueba y comprimirlos"
echo "2. Minijuego de sumas"
echo "3. Leer registro y salir"
read -p "Opción: " opcion
case $opcion in
1)
for i in {1..5}; do touch "$carpeta_test/archivo_$i.txt"; done
cp "$carpeta_test/archivo_1.txt" "$carpeta_test/copia.txt"
mv "$carpeta_test/archivo_2.txt" "$carpeta_test/movido.txt"
tar -czf "$carpeta_test/backup.tgz" "$carpeta_test" 2>/dev/null
du -h "$carpeta_test" | head -n 1
;;
2|M|m)
n1=$((RANDOM % 10 + 1))
n2=$((RANDOM % 10 + 1))
resultado_antiguo=$(expr $n1 + $n2)
read -p "¿Cuánto es $n1 + $n2? " resp
if [ "$resp" -eq "$resultado_antiguo" ]; then
echo "¡Correcto!"
((puntos++))
else
echo "Fallo."
((puntos--))
fi
;;
3|*)
echo "Tus puntos finales: $puntos"
while read -r linea; do echo "-> $linea"; done < "$fichero_log"
read -p "¿Borrar la carpeta de pruebas? (s/n): " borrar
if [ "$borrar" = "s" ]; then rm -rf "$carpeta_test"; fi
jugar=false
;;
esac
done
exit 0 