Skip to content

Tema 5: Programación Shell (Parte 2)

📝 Resumen Ejecutivo

Esta sesión profundiza en la automatización de tareas mediante Shell Scripting en Linux (específicamente Bash). Se abarca desde la estructura básica de un script y la gestión de permisos, hasta estructuras de control avanzadas (bucles, condicionales, arrays) y manejo de variables. El objetivo no es la programación de sistemas (como en C), sino la creación de scripts potentes y legibles para administrar el sistema operativo.


🔑 Conceptos Clave

  • Shell Script: Archivo de texto con comandos ejecutados secuencialmente por un intérprete.
  • Shebang (#!/bin/bash): Línea obligatoria al inicio que indica qué intérprete usar.
  • chmod +x: Comando crítico para otorgar permisos de ejecución al script.
  • Variables: Almacenes de información sin tipo formal (todo es texto).
  • Exit Status ($?): Código numérico que indica si el último comando se ejecutó correctamente (0 = éxito).

📚 Desarrollo del Temario

1. Estructura Básica y Ejecución

Para crear un script, se utiliza un editor de texto y se guarda típicamente con extensión .sh.

  • Sintaxis obligatoria: Todo script debe empezar con el shebang: #!/bin/bash.
  • Comentarios: Se inician con # y son ignorados por el intérprete.

⚠️ ¡OJO AL DATO!: Permisos de Ejecución

El profesor enfatizó repetidamente que escribir el código no es suficiente; sin permisos, el script no corre.

  • Comando: chmod +x script.sh da permisos de ejecución.
  • Seguridad (Visto en clase): El profesor advierte que chmod +x da permisos a todos los usuarios (propietario, grupo y otros).
    • Recomendación pro: Usar permisos más restrictivos como chmod 744 (Total para el dueño, solo lectura para el resto) en lugar de 777 (peligroso) o +x genérico.
  • Ejecución: Se lanza con ./script.sh (requiere permisos) o bash script.sh (crea una sub-shell, no requiere permiso +x).

2. Variables y Tipos de Datos

En Bash, no existen tipos de datos formales; todo se trata como texto, aunque se pueden realizar operaciones aritméticas si el contenido es numérico.

  • Asignación: variable=valor (Sin espacios alrededor del igual).
  • Acceso: Se usa el símbolo de dólar: echo $variable o ${variable}.
  • Variables Especiales (Muy preguntables en test):
    • $0: Nombre del script.
    • $1, $2...: Argumentos posicionales pasados al script.
    • $#: Número total de argumentos.
    • $?: Código de salida del último comando (0 es éxito, distinto de 0 es error).

Ejemplo de clase: Si guardas Hola Mundo en una variable llamada SALUDO, al hacer echo $SALUDO se imprimirá el texto. Si cambias el valor, la variable se actualiza dinámicamente.

3. Operaciones Aritméticas y Lógicas

Aunque son cadenas, el shell permite matemáticas básicas.

  • Aritmética: Se usa expr o la expansión $((...)).
    • Operadores: +, -, *, /, %.
    • Limitación: Bash nativo no maneja decimales (float) fácilmente, trata 5.5 como texto. Para decimales se requieren herramientas externas como bc.
    • Sintaxis recomendada: resultado=$((var1 + var2)).
  • Lógica:
    • && (AND), || (OR), ! (NOT).

4. Estructuras de Control de Flujo (Condicionales)

Permiten tomar decisiones dentro del script.

If - Elif - Else

La estructura evalúa una condición (usando test o corchetes [ ]).

if [ $n -gt 0 ]; then
    echo "Positivo"
elif [ $n -lt 0 ]; then
    echo "Negativo"
else
    echo "Cero"
fi
  • Operadores de comparación claves:
    • Numéricos: -gt (mayor), -lt (menor), -eq (igual), -ne (distinto).
    • Archivos: -e (existe), -f (es archivo), -d (es directorio).

Case (Switch)

Ideal para menús de opciones múltiples. Evalúa una variable contra patrones.

  • Sintaxis: case $variable in patrón) comandos ;; esac.
  • Comodín: *) se usa para "cualquier otra opción" (default).

5. Bucles e Iteraciones

El profesor destacó las diferencias sutiles entre los tipos de bucles.

A. For

Itera sobre una lista de valores o archivos.

  • Estilo lista: for i in 1 2 3; do ... done.
  • Estilo C: for ((i=0; i<5; i++)); do ... done.

B. While vs. Until (¡Pregunta de examen!)

  • While: Se ejecuta mientras la condición sea verdadera. Evalúa al principio.
  • Until: Se ejecuta hasta que la condición sea verdadera (o mientras sea falsa). Es la lógica inversa al While.

Nota del Profesor: Ambos pueden generar bucles infinitos (ej. while true). La diferencia principal radica en cuándo se evalúa la condición de parada.

6. Arrays (Arreglos)

Bash permite arrays unidimensionales dinámicos. No necesitas declarar el tamaño fijo al inicio.

  • Definición: nombres=("Ana" "Luis" "Juan").
  • Acceso a elemento: ${nombres[0]}.
  • Todos los elementos: ${nombres[@]}.
  • Tamaño del array: ${#nombres[@]}.
    • Detalle técnico: Si asignas índices salteados (ej. pos 0 y pos 5), el tamaño (count) será 2, no 6. El array no rellena huecos con nulos automáticamente.

🛠️ Actividad Práctica (Laboratorio)

El profesor describió el laboratorio evaluable (Actividad 2).

  • Objetivo: Crear un script con un menú recurrente.
  • Requisito Funcional: El menú debe mostrarse, ejecutar una acción (ej. ver espacio en disco, contar usuarios), y volver a mostrar el menú automáticamente. Solo debe salir si el usuario elige la opción "Salir".
  • Pista: Esto requiere encerrar la estructura case (menú) dentro de un bucle while infinito o controlado por una variable booleana.

🧠 Preguntas de Autoevaluación

  1. ¿Cuál es la diferencia funcional entre un bucle while y un bucle until?
    • Respuesta: while se ejecuta mientras la condición es verdadera; until se ejecuta mientras la condición es falsa (hasta que se vuelve verdadera).
  2. Si ejecuto chmod +x script.sh, ¿quién recibe permisos de ejecución?
    • Respuesta: Todos los usuarios del sistema (Propietario, Grupo y Otros). Para ser más restrictivo, se debería usar chmod 744 o similar.
  3. ¿Cómo se obtiene el número total de elementos almacenados en un array llamado lista?
    • Respuesta: ${#lista[@]}.
  4. En un script, ¿qué almacena la variable $??
    • Respuesta: El código de estado de salida del último comando ejecutado (0 indica éxito).
  5. ¿Es obligatorio poner extensión .sh para que un script funcione?
    • Respuesta: No es estrictamente obligatorio para el sistema operativo (lo que importa es el shebang y los permisos), pero es una convención estándar para identificar el tipo de archivo.