Menús interactivos en Bash Script con Gum 🐧
Continuamos explorando GUM, y en esta ocasión, analizaremos la función choose. Esta función nos permite crear menús y listas de selección en nuestros scripts de Bash, proporcionando una interfaz visual atractiva y mejorando la usabilidad. Además, su implementación y modificación son sencillas a nivel de código
Ya hablamos de GUM y otras funciones por aquí, además, te invito a que le eches un vistazo a esta otra publicación, donde explicamos lo básico de Bash script.
Ahora si continuemos 😉
Función choose
Esta función esta cargadas de opciones muy interesantes, permitiendo crear menús y listas de selección de elementos. Estas opciones las podemos consultar con el siguiente comando:
$ gum choose -help
Hay opciones que alargar mucho el comando de GUM y si son repetitivas las podemos definir como variables globales, facilitando la creación del código del script.
En esta publicación no usaremos variables globales ni todas las opciones de choose, pero las puede tener en consideración para futuros desarrollos.
Selección simple y múltiple
En el repositorio de GitHub del proyecto hay muchos ejemplos y demos, vamos a tomar uno prestado para mostrar la selección simple, como también la potencialidades de GUM.
Selección simple
De una lista de 52 opciones vamos a seleccionar una y el ejemplo es el siguiente.
El código:
#!/usr/bin/env bash
echo "Pick a card, any card..."
CARD=$(gum choose --height 15 {{A,K,Q,J},{10..2}}" "{♠,♥,♣,♦})
echo "Was your card the $CARD?"
exit 0
Vamos a explicar el código pero antes vemos algunos elementos de choose.
- El numero de elemento en pantalla la podemos definir con --height.
- Hay una barra de paginación, ya que son 52 elementos a seleccionar.
- Una ayuda visual del funcionamiento.
La opción {{A,K,Q,J},{10..2}}" "{♠,♥,♣,♦}) genera una lista con los siguiente elementos (A, K, Q, J, 10, 9, 8, 7, 6, 5, 4, 3, 2) y la combina con los símbolos (♠,♥,♣,♦) creando 52 combinaciones.
La combinación seleccionada es asignada a la variable CARD, luego con echo la mostramos.
Selección múltiple
De una lista podemos seleccionar mas de un elemento esto mediante la opción --limit vamos a ver el siguiente ejemplo sencillo donde seleccionaremos dos sabores (con la barra espaciadora) para nuestro helado 🍨
A continuación el código y la explicación de algunos elementos.
#!/usr/bin/env bash
echo "Ricos helado combinados"
echo "Selecciona dos sabores"
SABORES=$(gum choose --limit 2 --ordered "Chocolate" "Fresa" "Mantecado" \
"Ron" "Piña" "Parchita" "Guanabana" "Menta" "Vainilla" "Chicle" "Café" \
"Limón" | awk '{print tolower($0)}')
HELADOS=(${SABORES// / })
echo "El helado es de "${HELADOS[0]}" y "${HELADOS[1]}""
exit 0
- Use la barra \ para partir el comando que es muy largo.
- La selección de los sabores queda limitada a dos con --limit.
- La lista queda ordenada gracias a la opción --ordered.
- Usamos AWK para colocar en minúscula todas las palabras con la opción de tolower.
- Los dos sabores se lo asignamos a la variable SABORES.
- Luego convertimos SABORES en un ARRAY, para usar cada elemento por separado.
Menús
Para realizar menús usamos la selecciona simple y luego se lo podemos pasar a un CASE para que ejecute comandos o sub programas.
A continuación el código y una breve explicación.
#!/usr/bin/env bash
VARIABLE=$(gum choose "Ejemplo 1" "Ejemplo 2" "Ejemplo 3" "Ejemplo 4" | awk '{print($2)}')
case $VARIABLE in
1)
echo -e "Opción 1"
;;
2)
echo -e "Opción 2"
;;
3)
echo -e "Opción 3"
;;
4)
echo -e "Opción 4"
;;
*)
echo -e "Opción de emergencia"
;;
esac
exit 0
- Las opciones se componen de dos palabras, con AWK seccionamos las segunda que son los números y se la asignamos a VARIBLE.
- Luego con CASE ejecutamos el caso pertinente según la selección.
- En el caso que el usuario force el cierre de choose como por ejemplo con la combinación de teclas control+c, tenemos la opción por defecto de CASE y podemos programar algo de emergencia que lo tome en consideración.
Menú simple
Hay una sola palabra en la selección como vemos a continuación.
El código es mas sencillo y es el siguiente.
#!/usr/bin/env bash
echo "Selecciona una opción"
VARIABLE=$(gum choose "Guardar" "Respaldar" "Copiar" "Actualizar" "Apagar" "Salir" | awk '{print tolower($0)}')
echo
echo "Usted selecciono"
case $VARIABLE in
guardar)
echo -e "La opción Guardar"
;;
respaldar)
echo -e "La opción Respaldar"
;;
copiar)
echo -e "La opción Copiar"
;;
actualizar)
echo -e "La opción Actualizar"
;;
apagar)
echo -e "La opción Apagar"
;;
salir)
echo -e "La opción Salir"
;;
*)
echo -e "Opción de emergencia"
;;
esac
exit 0
Nos valemos nuevamente de AWK para colocar la selección en minúscula, lo demás es igual al caso anterior.
Aclaración sobre AWK
Si le pasamos $0 tomara toda la oración, si es una palabra no abra problema, en el caso de $1 solo tomara la primera palabra de la oración, $2 toma la segunda palabra de la oración y así sucesivamente...
Menú descriptivo
Podemos colocar una oración, que de mas detalle de la selección y nuevamente nos valemos de AWK para seleccionar la palabra que usaremos de variable. Ademas nos aseguramos que la convierta en minúscula, como en casos anteriores.
El código es es el siguiente:
#!/usr/bin/env bash
echo "Selecciona una opción"
VARIABLE=$(gum choose "Paz Mundial" "Realizar respaldo" \
"Borrar todo" "Actualizar Sistema" "Menú Principal" \
"Salir del programa" | awk '{print tolower($2)}')
echo
echo "Usted selecciono"
case $VARIABLE in
mundial)
echo -e "Opción Paz Mundial"
;;
respaldo)
echo -e "Opción Realizar respaldo"
;;
todo)
echo -e "Opción Borrar todo"
;;
sistema)
echo -e "Opción Actualizar Sistema"
;;
principal)
echo -e "Opción Menú Principal"
;;
del)
echo -e "Salir del programa"
;;
*)
echo -e "Opción de emergencia"
;;
esac
exit 0
Con AWK y tolower seleccionamos la segunda fila de la oración y que la convierta en minúsculas.
La selección de la fila, es para evitar palabras repetidas o con tildes, cualquier cosas que nos dificulte usar CASE adecuadamente.
Palabras finales
Cualquier pequeña aclaración de lo aquí expuesto en la caja de comentario, si quiere mas ejemplos en el GitHub del proyecto, otros usuario puede darnos mas trucos como por ejemplo con AWK me facilito mucho las cosas, eso lo vi aquí.
Para terminar, mas publicaciones sobre Bash Script aquí y sobre GUM aquí.
Comentarios
Publicar un comentario
🤔 con que esto tenemos...