Tabla de contenido
Una vez más aquí. En esta ocasión vamos a echar un vistazo a algunos conceptos básicos de la construcción select en Bash. El comando ‘select‘ es un comando bash muy útil para la creación de menús en bash. Los diferentes tipos de tareas de generación de menús, como la creación de una lista basada en menús, la creación de un menú a partir del contenido del archivo, etc., se pueden realizar mediante el comando bash select.
Construye con Bash Select
Como decía, la construcción select genera un menú a partir de una lista de elementos. Además esta tiene casi la misma sintaxis que el bucle for:
select ELEMENTO in [LISTA] do [COMANDOS] done
La [LISTA] puede ser una serie de cadenas separadas por espacios, un rango de números, la salida de un comando, una matriz, etc. Se puede configurar una solicitud personalizada para la construcción select usando la variable de entorno PS3.
Cuando se invoca la construcción, cada elemento de la lista se imprime en la pantalla, precedido por un número.
Si el usuario escribe un número que corresponde al número de uno de los elementos mostrados, entonces el valor de [ELEMENTO] se establece en ese elemento. El valor del elemento seleccionado se almacena en la variable RESPUESTA. De lo contrario, si la entrada del usuario está vacía, la solicitud y la lista del menú se muestran nuevamente.
El ciclo de selección continuará ejecutándose y solicitará la entrada del usuario hasta que se ejecute el comando de interrupción.
Para empezar y poder probar los ejemplos que ilustrarán este menú, vamos a crear un archivo bash llamado select1.sh. En todos estos ejemplos el comando ‘select’ va a recuperar la información de la lista, e imprimirá la información como un menú.
Ejemplos de bash select
Una lista
Para demostrar cómo funciona la construcción select, echemos un vistazo al siguiente ejemplo simple.
#!/bin/bash # Definimos el menú PS3="Seleccionar un número: " select character in Sheldon Leonard Penny Howard Raj do echo "El personaje seleccionado es: $character" echo "el número seleccionado ha sido: $REPLY" done
Para ejecutar el script creado solo tenemos que ejecutarlo de la siguiente manera:
bash select1.sh
El script mostrará un menú que consta de elementos de la lista con un número que lo acompaña y el mensaje de PS3. Cuando el usuario escribe un número, el script imprimirá el mensaje y el número seleccionado.
Una calculadora de números enteros
Ahora echemos un vistazo a un ejemplo más práctico. Se trata de una calculadora simple que solicita al usuario que escriba los números y ella realizará las operaciones aritméticas básicas como; suma, resta, multiplicación y división.
#!/bin/bash # Define la lista del menú aqui PS3="Selecciona una operación: " select opt in suma resta multiplicar dividir salir; do case $opt in suma) read -p "Escribe el primer número: " n1 read -p "Escribe el segundo número: " n2 echo "$n1 + $n2 = $(($n1+$n2))" ;; resta) read -p "Escribe el primer número: " n1 read -p "Escribe el segundo número: " n2 echo "$n1 - $n2 = $(($n1-$n2))" ;; multiplicar) read -p "Escribe el primer número: " n1 read -p "Escribe el segundo númnero: " n2 echo "$n1 * $n2 = $(($n1*$n2))" ;; dividir) read -p "Escribe el primer número: " n1 read -p "Escrib el segundo número: " n2 echo "$n1 / $n2 = $(($n1/$n2))" ;; salir) break ;; *) echo "$REPLY no es una operación válida" ;; esac done
Cuando se ejecuta el script, muestra el menú y la solicitud de PS3. Se le solicita al usuario que seleccione la operación y luego escriba dos números. Dependiendo de la entrada del usuario, el script imprimirá el resultado. Se le pedirá al usuario que realice una nueva operación después de cada selección hasta que se ejecute el comando break. En caso de seleccionar un operación inválida, se va a mostrar un mensaje de error.
Un inconveniente de este script es que solo puede funcionar con enteros.
Calculadora que admite números flotantes
Aquí hay una versión un poco más avanzada del anterior script. En ella vamos a utilizarla herramienta bc que admite números flotantes para realizar cálculos matemáticos. Además, el código repetitivo se agrupa dentro de una función llamada calcular().
#!/bin/bash # Definimos el menú calcular () { read -p "Escribe el primer número: " n1 read -p "Escribe el segundo número: " n2 echo "$n1 $1 $n2 = " $(bc -l <<< "$n1$1$n2") } PS3="Selecciona una operación: " select opt in sumar restar multiplicar dividir salir; do case $opt in sumar) calcular "+";; restar) calcular "-";; multiplicar) calcular "*";; dividir) calcular "/";; salir) break;; *) echo "$REPLY es una opción inválida" ;; esac done
El resultado del anterior script es como el que podemos ver en la siguiente captura de pantalla:
Como espero que se haya podido ver, la construcción select permite generar menús fácilmente. Es especialmente útil al escribir scripts de shell que requieren la entrada del usuario. Todos estos ejemplos de select, buscan ser lo más sencillos posibles en cuanto a la creación del menú Bash se refiere.