Administración de Sistemas Operativos – Repaso de estructuras en programación IF/FOR/WHILE/CASE

En programación, las estructuras son formas de organizar y controlar el flujo de un programa, existen varios tipos de estructuras:
Estructuras secuenciales: Son instrucciones que se ejecutan una tras otra, en secuencia, de arriba hacia abajo. Es el flujo de ejecución más básico.
Estructuras de selección (condicionales): Permiten tomar decisiones basadas en condiciones específicas. Los condicionales más comunes son if, if-else, if-elseif-else, switch, entre otras.
Estructura de repetición (bucles o ciclos): Nos permiten ejecutar un bloque de código repetidamente mientras se cumpla una condición.

La programación en la shell ofrece una herramienta poderosa para la automatización de tareas, permitiendo a los usuarios optimizar su flujo de trabajo mediante la creación de scripts. Estos archivos contienen una secuencia de comandos que pueden ejecutarse de manera consecutiva con una sola instrucción, lo que resulta especialmente útil tanto para operaciones repetitivas como para aquellas que se realizan con poca frecuencia y cuya sintaxis podría ser difícil de recordar. Además de mejorar la eficiencia y reducir la carga de trabajo manual, el uso de scripts minimiza el riesgo de errores humanos y garantiza la consistencia en la ejecución de procesos. Gracias a su flexibilidad y rendimiento, la shell se convierte en una aliada indispensable para administradores de sistemas, desarrolladores y cualquier usuario que desee automatizar tareas en su entorno.

En la programación con shell, el uso de estructuras de control como las repetitivas y condicionales permite desarrollar scripts dinámicos y versátiles. Los bucles for y while facilitan la ejecución iterativa de comandos, mientras que las estructuras condicionales if permiten la toma de decisiones en función de distintas condiciones.

A pesar de la aparente complejidad que pueden adquirir ciertos scripts, en esencia, toda lógica se basa en combinaciones de repeticiones y condiciones. Una particularidad del shell, en contraste con lenguajes como C o Java, es su convención inversa en la evaluación de valores booleanos: el valor 0 representa verdadero (true), mientras que cualquier otro valor indica falso (false).

Esta convención surge de la naturaleza de los comandos en shell, que retornan 0 cuando se ejecutan correctamente y valores distintos de 0 en caso de error. Además, para establecer condiciones dentro de los scripts, se pueden utilizar los comandos true y false, que devuelven explícitamente estos valores y permiten construir estructuras de control más claras y manejables.

REPASO DE ESCTRUCTURA IF

En Bash, la estructura if se utiliza para evaluar condiciones y ejecutar comandos en función del resultado. Su sintaxis básica es la siguiente

if [ condición ]; then
    # Comandos si la condición es verdadera
fi

O también:

if [ condición ]; then
    # Comandos si la condición es verdadera
else
    # Comandos si la condición es falsa
fi

También podemos incluir múltiples condiciones con elif:

if [ condición1 ]; then
    # Comandos si la condición1 es verdadera
elif [ condición2 ]; then
    # Comandos si la condición2 es verdadera
else
    # Comandos si ninguna condición es verdadera
fi

Ejemplo 1: Comparación de números

#!/bin/bash

read -p "Ingrese un número: " num

if [ $num -gt 10 ]; then
    echo "El número es mayor que 10."
else
    echo "El número es 10 o menor."
fi

Ejemplo 2: Comparación de cadenas

#!/bin/bash

read -p "Ingrese 'si' o 'no': " respuesta

if [ "$respuesta" == "si" ]; then
    echo "Usted ha respondido afirmativamente."
elif [ "$respuesta" == "no" ]; then
    echo "Usted ha respondido negativamente."
else
    echo "Respuesta no válida."
fi

Comparación de números
OperadorSignificado
-eqIgual (==)
-neNo igual (!=)
-gtMayor (>)
-ltMenor (<)
-geMayor o igual (>=)
-leMenor o igual (<=)
Comparación de cadenas
OperadorSignificado
==Igual
!=No igual
-zCadena vacía
-nCadena no vacía
Verificación de archivos y directorios
OperadorSignificado
-f¿Es un archivo regular?
-d¿Es un directorio?
-e¿Existe?
-r¿Tiene permisos de lectura?
-w¿Tiene permisos de escritura?
-x¿Es ejecutable?

REPASO DE ESTRUCTURA FOR

El bucle for en Bash se usa para iterar sobre una lista de valores o un rango de números. Es útil para repetir una serie de comandos un número determinado de veces sin necesidad de escribirlos manualmente.

Iteración sobre una lista de valores

for variable in lista_de_valores; do
    # Comandos a ejecutar
done

Ejemplo:

#!/bin/bash

for nombre in Ana Juan Pedro María; do
    echo "Hola, $nombre"
done

Iteración sobre un rango de números

for i in {1..5}; do
    echo "Número: $i"
done

También se puede agregar un paso usando {inicio..fin..paso}

for i in {1..10..2}; do
    echo "Valor: $i"
done

Otra forma de generar un rango es usando seq.

for i in $(seq 1 2 10); do
    echo "Iteración: $i"
done

Iteración sobre archivos en un directorio

for archivo in *.txt; do
    echo "Procesando archivo: $archivo"
done

Usando for con C-style (similar a C, Java, etc.)

for ((i=1; i<=5; i++)); do
    echo "Iteración número $i"
done

RESUMEN

Forma de forEjemplo
Lista de valoresfor i in rojo verde azul; do echo $i; done
Rango de númerosfor i in {1..5}; do echo $i; done
seqfor i in $(seq 1 2 10); do echo $i; done
Archivos en directoriofor archivo in *.txt; do echo $archivo; done
Estilo Cfor ((i=1; i<=5; i++)); do echo $i; done
breakDetiene el bucle en cierta condición
continueSalta una iteración y sigue con la siguiente

El bucle for en Bash es muy flexible y se puede usar para recorrer listas, rangos, archivos y más. Dependiendo del caso, podemos elegir la sintaxis que mejor se adapte a nuestro propósito.

REPASO DE ESTRUCTURA WHILE

El bucle while en Bash permite ejecutar un bloque de código mientras una condición sea verdadera. Es útil cuando no sabemos cuántas veces se ejecutará el código, ya que depende de una condición en tiempo de ejecución.

while [ condición ]; do
    # Comandos a ejecutar
done

La condición se evalúa antes de cada iteración.
Si la condición es true, el bucle sigue ejecutándose.

#!/bin/bash

contador=1

while [ $contador -le 5 ]; do
    echo "Iteración $contador"
    ((contador++))  # Incrementar contador
done

El while es útil para mantener programas interactivos hasta que el usuario introduzca un valor específico.

#!/bin/bash

opcion=""

while [ "$opcion" != "salir" ]; do
    echo "Escribe algo (o 'salir' para terminar):"
    read opcion
    echo "Ingresaste: $opcion"
done

echo "Programa finalizado."

Uso con archivos (Leer línea por línea)

#!/bin/bash

while IFS= read -r linea; do
    echo "Línea: $linea"
done < archivo.txt

Explicación:

  • IFS= evita que read elimine espacios en blanco.
  • -r evita que \ se interprete como carácter especial.
  • Se lee el archivo archivo.txt línea por línea.

Uso con break y continue
break → Termina el bucle inmediatamente.
continue → Salta la iteración actual y sigue con la siguiente.

Ejemplo con break

contador=1

while [ $contador -le 10 ]; do
    if [ $contador -eq 5 ]; then
        echo "Se detiene en $contador"
        break
    fi
    echo "Número: $contador"
    ((contador++))
done

Ejemplo con continue

contador=0

while [ $contador -lt 5 ]; do
    ((contador++))
    if [ $contador -eq 3 ]; then
        echo "Salta el número $contador"
        continue
    fi
    echo "Número: $contador"
done

El while también es útil para hacer pausas o contadores regresivos.

#!/bin/bash

segundos=5

while [ $segundos -gt 0 ]; do
    echo "Tiempo restante: $segundos segundos"
    sleep 1
    ((segundos--))
done

echo "¡Tiempo terminado!"

RESUMEN

Uso de whileEjemplo
Contador simplewhile [ $i -le 5 ]; do echo $i; ((i++)); done
Leer entrada de usuariowhile [ "$opcion" != "salir" ]; do read opcion; done
Leer archivo línea a líneawhile IFS= read -r linea; do echo $linea; done < archivo.txt
Esperar conexión a Internetwhile ! ping -c 1 google.com &> /dev/null; do sleep 2; done
break (salir del bucle)if [ $i -eq 5 ]; then break; fi
continue (saltar iteración)if [ $i -eq 3 ]; then continue; fi
Temporizadorwhile [ $segundos -gt 0 ]; do sleep 1; ((segundos--)); done

La estructura case en Bash permite evaluar una variable o expresión y ejecutar diferentes bloques de código según su valor. Es una alternativa más elegante y clara que múltiples sentencias if-elif-else cuando hay muchas condiciones posibles.

case variable in
    patron1)
        # Comandos a ejecutar si la variable coincide con patron1
        ;;
    patron2)
        # Comandos a ejecutar si la variable coincide con patron2
        ;;
    *)
        # Comandos a ejecutar si no coincide con ningún patrón (opcional)
        ;;
esac

  • Cada patrón termina con )
  • Cada bloque de comandos termina con ;; para evitar que el programa siga ejecutando otros casos.
  • El caso * actúa como «default» si ninguna condición se cumple.
#!/bin/bash

echo "Elige una opción: (1-3)"
read opcion

case $opcion in
    1)
        echo "Elegiste la opción 1"
        ;;
    2)
        echo "Elegiste la opción 2"
        ;;
    3)
        echo "Elegiste la opción 3"
        ;;
    *)
        echo "Opción no válida"
        ;;
esac

El case no solo funciona con números, sino también con cadenas de texto.

#!/bin/bash

echo "Ingrese un color:"
read color

case $color in
    rojo)
        echo "El color rojo representa la pasión."
        ;;
    azul)
        echo "El color azul representa la tranquilidad."
        ;;
    verde)
        echo "El color verde representa la naturaleza."
        ;;
    *)
        echo "No conozco ese color."
        ;;
esac

Uso con múltiples valores en una sola opción

#!/bin/bash

echo "Ingrese una fruta:"
read fruta

case $fruta in
    manzana|pera|durazno)
        echo "Es una fruta de árbol."
        ;;
    banana|plátano)
        echo "Es una fruta tropical."
        ;;
    uva|sandía|melón)
        echo "Es una fruta de viña o enredadera."
        ;;
    *)
        echo "No reconozco esa fruta."
        ;;
esac

Otra opción:

#! /bin/bash
clear
PS3="Introduce una opción: "
select opcion in "1" "2" "3" "4"; do
case $opcion in
	1) echo "Opcion 1" ;;
	2) echo "Opcion 2" ;;
	3) echo "Opcion 3" ;;
	4) echo "Adios"; break ;;
	*) echo "No has introducido un valor correcto" ;;
esac
done

Menú de ejemplo para proyectos

#!/bin/bash
#Script de usuarios
#*************VARIABLES GLOBALES*********
opc=0
#****************************************

#**************FUNCIONES*****************
function menu(){
	echo "MENU"
	echo "1 - Agregar usuario"
	echo "2 - Listar usuarios"
	echo "3 - Buscar usuarios"
	echo "4 - Borrar usuarios"
	echo "5 - Bloquear usuario"
	echo "6 - Desbloquear usuario"
	echo "7 - Cambiar contraseña"
	echo "8 - Volver"
	echo "Ingrese una opcion: "
}

#***************MAIN**********************
while [ $opc -ne 8 ];
do
    menu
    read -p "Ingrese una opción: " opc
    case $opc in
    1)
		echo "OPCIÓN 1 - ALTA DE USUARIOS" ;
		altaUsuario;;
    2) echo "OPCIÓN 2 - LISTAR USUARIOS" ;;
    3) echo "OPCIÓN 3 - " ;;
    4) echo "OPCIÓN 4 - " ;;
    5) echo "OPCIÓN 5 - " ;;
    6) echo "OPCIÓN 6 - " ;;
    7) echo "OPCIÓN 7 - " ;;
    8) echo "OPCIÓN 8 - Hasta luego " ; break ;;
    *) echo "OPCIÓN POR DEFECTO - " ;;
    esac
done
#*****************************************

Deja un comentario

I’m Luis E. Fagúndez

Bienvenidos a mi página web personal. Mi nombre es Luis, me gusta enseñar, programar y tomar litros y litros de café.

En esta web vas a encontrar materiales sobre educación, programación, Gnu/Linux, software libre y mucho más.

Esta web busca brindar información sobre las asignaturas que imparto en DGETP-UTU, así como proyectos personales y otras cosas.

Gracias por ser parte de esta hermosa comunidad.

Formas de contacto