Control de Flujo y Entrada por Consola en Shell Bash

Estructuras Condicionales con if

La sintaxis básica para una sentencia if en bash es la siguiente:

if [ condición ]; then
    comandos
fi

O en forma extendida:

if [ condición ]
then
    comandos
fi

Consideraciones importantes:

  • Debe haber un espacio entre los corchetes y la condición.
  • Después de "if" se requiere un espacio.

Ejemplo práctico: Determinar si un número es par o impar.

#!/bin/bash
numero=$1
if [ $((numero % 2)) -eq 0 ]
then
    echo "El número $numero es par."
else
    echo "El número $numero es impar."
fi

Para ejecutar, asignar permisos y pasar un argumento:

chmod +x par_impar.sh
./par_impar.sh 4

Conmutador con case

La estructura case permite ejecutar bloques de código según el valor de una variable.

case $variable in
    patrón1)
        comandos1
        ;;
    patrón2)
        comandos2
        ;;
    *)
        comandos_por_defecto
        ;;
esac

Reglas de sintaxis:

  • La línea de case debe terminar con "in".
  • Cada patrón se cierra con ")" y los comnados terminan con ";;".
  • El asterisco "*" actúa como comodín para el caso por defecto.

Ejemplo: Menú interactivo para seleccionar una opción.

#!/bin/bash
echo "Seleccione una opción:"
echo "1. Mostrar fecha actual"
echo "2. Listar archivos en el directorio actual"
echo "3. Salir"
read opcion
case $opcion in
    1)
        fecha=$(date)
        echo "Fecha y hora: $fecha"
        ;;
    2)
        ls -la
        ;;
    3)
        echo "Saliendo del script."
        exit 0
        ;;
    *)
        echo "Opción no válida."
        ;;
esac

Ejecución:

chmod +x menu_case.sh
./menu_case.sh

Bucles con for

Sintaxis aritmética

Para iterar con un contador definido:

for (( inicialización; condición; incremento ))
do
    comandos
done

Ejemplo: Calcular la suma de los primeros 20 números naturales.

#!/bin/bash
total=0
for (( contador=1; contador<=20; contador++ ))
do
    total=$((total + contador))
done
echo "La suma es: $total"

Guardado como suma_for.sh y ejeuctado con bash suma_for.sh.

Sintaxis de iteración sobre lista

Para recorrrer una serie de valores o argumentos:

for variable in lista_valores
do
    comandos
done

Ejemplo: Procesar los argumentos pasados al script, diferenciando entre "$*" y "$@".

#!/bin/bash
echo "Iterando con \$*:"
for item in $*
do
    echo "Elemento: $item"
done
echo "Iterando con \$@:"
for elemento in $@
do
    echo "Elemento: $elemento"
done

Cuando se encierran en comillas dobles, "$*" trata todos los parámetros como una sola cadena, mientras que "$@" los conserva como elementos separados.

#!/bin/bash
echo "Con \$* entre comillas:"
for parte in "$*"
do
    echo "Cadena completa: $parte"
done
echo "Con \$@ entre comillas:"
for segmento in "$@"
do
    echo "Segmento individual: $segmento"
done

Ejecución con múltiples argumentos: bash argumentos.sh uno dos tres.

Bucle while

El bucle while ejecuta comandos mientras se cumpla una condición.

while [ condición ]
do
    comandos
done

Ejemplo: Contar los divisores de un número ingresado.

#!/bin/bash
numero=12
divisor=1
contador=0
while [ $divisor -le $numero ]
do
    if [ $((numero % divisor)) -eq 0 ]
    then
        contador=$((contador + 1))
    fi
    divisor=$((divisor + 1))
done
echo "El número $numero tiene $contador divisores."

Para ejecutarlo: chmod +x divisores.sh && ./divisores.sh.

Lectura de Entrada desde la Consola con read

El comando read permite capturar datos del usuario durante la ejecución.

read [opciones] [variable]

Opciones comunes:

  • -p "mensaje": Muestra un mensaje antes de leer.
  • -t segundos: Establece un tiempo de espera para la entrada.

Ejemplo: Solicitar un nombre de usuario con un límite de tiempo.

#!/bin/bash
read -t 10 -p "Ingrese su nombre de usuario (10 segundos): " usuario
if [ -n "$usuario" ]
then
    echo "Bienvenido, $usuario."
else
    echo "No se ingresó ningún nombre."
fi

Guardar como leer_usuario.sh y ejecutar con bash leer_usuario.sh.

Etiquetas: bash shell-scripting control-flow case-statements for-loops

Publicado el 7-16 21:15