Shell Scripting – Seleccionar bucle

El bucle de selección es una de las categorías de bucles en la programación de bash. Un ciclo de selección en el shell se puede detener en dos casos solo si hay una declaración de interrupción o una interrupción del teclado. El principal objetivo de usar un ciclo de selección es que representa diferentes elementos de datos en forma de una lista numerada para el usuario. El usuario puede seleccionar fácilmente una de las opciones enumeradas por el programa.

 La sintaxis de un ciclo de selección general se da a continuación,

Sintaxis:

select myVariable in variable1 variable2 ... variableN
do
    # body to be executed for 
    # every value in the sequence.
done

Aquí, myVariable es una variable que se utiliza para hacer referencia a cada uno de los valores de la variable1 a la variableN.

Ejemplo 1:

En el programa a continuación, estamos creando un menú numerado para permitir que un usuario (o estudiante de Btech) seleccione el departamento. 

Código fuente:

# Program to demonstrate the working of a 
# select-loop in shell scripting

# PS3="Enter your choice ==> "
# echo "What is your department?"
 
select department in CS IT ECE EE
do
  case $department in

     CS)
        echo "I am from CS department."
        ;;

 IT)
        echo "I am from IT department."
     ;;

      ECE)
        echo "I am from ECE department."
     ;;

 EE)
        echo "I am from EE department."
     ;;

     none)
        break
     ;;

     *) echo "Invalid selection"
     ;;
  esac
done

Producción:

Ejemplo 2:

En el siguiente programa, estamos creando un menú numerado para permitir que un usuario seleccione un número. Una vez que el usuario selecciona un número, mostramos si el número es par o impar.  

Código fuente:

# Program to demonstrate the working of
# a select-loop in shell scripting

# PS3="Enter your choice ==> "
# echo "Choose a number:"
  
select num in 1 2 3 4 5 6 7
do
   case $num in
      2|4|6|8) 
         echo "Even number."
         ;;
      1|3|5|7)
         echo "Odd number."
      ;;
      none) 
         break 
      ;;
      *) echo "ERROR: Invalid selection" 
      ;;
   esac
done

Producción:

Seleccionar bucle con indicaciones de entrada:

Podemos avisar a los usuarios antes de solicitar cualquier selección del menú con la ayuda de la variable PS3 en la programación de bash. Esta variable debe declararse antes del ciclo de selección. El valor o la string con la que se inicializa una variable de PS3 se utiliza para avisar al usuario en la consola. 

Ejemplo 1:

En el programa a continuación, le hemos pedido al usuario que «Ingrese su elección ==>».

Código fuente:

# Program to demonstrate the working of a 
# select-loop in shell scripting

PS3="Enter your choice ==> "
echo "What is your department?"
  
select department in CS IT ECE EE
do
   case $department in

      CS) 
         echo "I am from CS department."
         ;;

        IT)
         echo "I am from IT department."
      ;;

       ECE)
         echo "I am from ECE department."
      ;;

        EE)
         echo "I am from EE department."
      ;;
 
      none) 
         break 
      ;;

      *) echo "Invalid selection" 
      ;;
   esac
done

Producción:

Ejemplo 2:

En este programa, le hemos pedido al usuario que “Ingrese su elección ==>”.

Código fuente:

# Program to demonstrate the working of a 
# select-loop in shell scripting

PS3="Enter your choice ==> "
echo "Choose a number:"
  
select num in 1 2 3 4 5 6 7
do
   case $num in
      2|4|6|8) 
         echo "Even number."
         ;;
      1|3|5|7)
         echo "Odd number."
      ;;
      none) 
         break 
      ;;
      *) echo "ERROR: Invalid selection" 
      ;;
   esac
done

Producción:

Pipe out options to a select loop in bash

Cuando se alcanza el final del archivo (EOF) de la entrada, el ciclo de selección se completa en bash. Pero en el caso de un comando enviado a nuestro script, la salida del comando anterior se convierte en la entrada del comando actual.

Entendamos qué significa un comando de canalización en bash. La tubería se considera uno de los operadores más poderosos del caparazón. Se denota con el símbolo (|). La tubería toma la salida de un comando y la usa como entrada para otro. Y no estamos limitados a un solo comando canalizado, sino que podemos apilarlos tantas veces como desee, o hasta que se quede sin salida o descriptores de archivo. Pero en el caso de un bucle de selección, el uso de un comando pipe out puede llevar a que no haya salida, como se demuestra en el programa a continuación.  

Ejemplo:

Código fuente:

# Program to demonstrate the working of a 
# select-loop in shell scripting

# script: select-loop-bash.sh
select department in CS IT ECE EE
do
   case $department in

      CS) 
         echo "I am from CS department."
         ;;

        IT)
         echo "I am from IT department."
      ;;

       ECE)
         echo "I am from ECE department."
      ;;

        EE)
         echo "I am from EE department."
      ;;
 
      none) 
         break 
      ;;

      *) echo "Invalid selection" 
      ;;
   esac
done

Comandos interactivos (uno tras otro) y la salida:

Entubado:

¿Cómo arreglar la falta de salida al usar el comando pipe out?

Este problema se puede solucionar asegurándose de que el menú de selección se lea desde «/dev/tty» y que estemos pasando la opción con el delimitador de palabra adecuado usando los comandos «echo» o «printf».

Ejemplo:

Código fuente:

# Program to demonstrate the working of a 
# select-loop in shell scripting

# script: select-loop-bash.sh
select department in CS IT ECE EE
do
   case $department in

      CS) 
         echo "I am from CS department."
         ;;

        IT)
         echo "I am from IT department."
      ;;

       ECE)
         echo "I am from ECE department."
      ;;

        EE)
         echo "I am from EE department."
      ;;
 
      none) 
         break 
      ;;

      *) echo "Invalid selection" 
      ;;
   esac
done < /dev/tty

Comandos interactivos (uno tras otro) y la salida:

Publicación traducida automáticamente

Artículo escrito por bhuwanesh y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *