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.
Estos ejemplos demuestran la versatilidad de AWK. No obstante, la programaci贸n de men煤s se simplifica al utilizar listas num茅ricas o alfab茅ticas 馃憤
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铆.








