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.shda permisos de ejecución. - Seguridad (Visto en clase): El profesor advierte que
chmod +xda 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 de777(peligroso) o+xgenérico.
- Recomendación pro: Usar permisos más restrictivos como
- Ejecución: Se lanza con
./script.sh(requiere permisos) obash 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 $variableo${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 Mundoen una variable llamadaSALUDO, al hacerecho $SALUDOse 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
expro la expansión$((...)).- Operadores:
+,-,*,/,%. - Limitación: Bash nativo no maneja decimales (float) fácilmente, trata
5.5como texto. Para decimales se requieren herramientas externas comobc. - Sintaxis recomendada:
resultado=$((var1 + var2)).
- Operadores:
- 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).
- Numéricos:
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.
- Detalle técnico: Si asignas índices salteados (ej. pos 0 y pos 5), el tamaño (
🛠️ 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 buclewhileinfinito o controlado por una variable booleana.
🧠 Preguntas de Autoevaluación
- ¿Cuál es la diferencia funcional entre un bucle
whiley un bucleuntil?- Respuesta:
whilese ejecuta mientras la condición es verdadera;untilse ejecuta mientras la condición es falsa (hasta que se vuelve verdadera).
- Respuesta:
- 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 744o similar.
- Respuesta: Todos los usuarios del sistema (Propietario, Grupo y Otros). Para ser más restrictivo, se debería usar
- ¿Cómo se obtiene el número total de elementos almacenados en un array llamado
lista?- Respuesta:
${#lista[@]}.
- Respuesta:
- En un script, ¿qué almacena la variable
$??- Respuesta: El código de estado de salida del último comando ejecutado (0 indica éxito).
- ¿Es obligatorio poner extensión
.shpara 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.