Los que estamos acostumbrados a programar en Shell Scripting, echamos de menos muchas veces la opción de crear de forma rápida y atractiva scripts de shell que tengan una presentación un poco mas ... friendly. Si haces memoria, seguro que has visto alguna consola de GNU/Linux con fondo azul y un cuadro de diálogo donde te hace preguntas del tipo "introduce la contraseña del servidor de mysql" u opciones similares. Bien, os voy a enseñar como crear esas pantallas de una forma súper rápida y funcional. Como es lógico, se necesita un conocimiento básico/medio de Shell Scripting para poder adaptar tus scripts a las necesidades de estas pantallas.
Whiptail es un programa que permite mostrar cuadros de diálogo en nuestro shell y poder dar algo mas de color a nuestros shell scripts. Podemos crear menus, check list, barras de progreso y todo de una forma muy friendly. Whiptail viene incluido por defecto en GNU/Linux Debian.
¡Espero que os guste mucho este nuevo tutorial!
1.- ELEMENTOS UTILIZADOS EN ESTE TUTORIAL
Los recursos utilizados para este tutorial han sido:
GNU/Linux Debian 8 64bits
2.- CREAR DIÁLOGOS "INFO"
Un cuadro de diálogo sencillo en Whiptail es el info box. Muestra un cuadro de diálogo que contiene el texto que el usuario especifica. En la sintaxis , la opción de --title muestra el título en la parte superior del cuadro de diálogo. El argumento --infobox indica el texto que contendrá el cuadro de diálogo debajo del título. Los últimos 2 argumentos indican el algo y el ancho del cuadro de diálogo. El ancho suele tomar el valor de 78 ya que la mayoría de terminales tienen un total de 80 columnas o más.
Sintaxis:
whiptail --title "" --infobox ""
Mi ejemplo de info box:
whiptail --title "EJEMPLO INFO BOX" --infobox "Bienvenidos a mi web www.raulprietofernandez.net" 8 78
Info Box
3.- CREAR DIÁLOGOS "MESSAGE"
El cuadro de diálogo de tipo message box es muy similar al de info box, excepto que en este caso, se espera a que el usuario presione el botón de OK antes de continuar. El uso es bastante similar.
Una forma sencilla de obtener órdenes del usuario es a través de un cuadro de diálogo de Si/No. Este cuadro de diálogo muestra 2 botones con la etiqueta Si/No, aunque esta etiqueta se puede cambiar.
Sintaxis:
whiptail --title "
" --yesno ""
Mi ejemplo de yes/no box:
#/bin/bash if (whiptail --title "EJEMPLO SI/NO" --yesno "Este es un ejemplo de un cuadro de dialogo de si/no" 8 78) then echo "Has seleccionado Si, exit toma el valor de $?." else echo "Has seleccionado No, exit toma el valor de $?." fi
Cuadro de diálogo Si/No
Podemos personalizar los botones de la siguiente forma:
#/bin/bash if (whiptail --title "EJEMPLO SI/NO" --yes-button "Acepto las condiciones" --no-button "No acepto las condicioens" --yesno "¿Aceptas las Cookies de este sitio?" 8 78) then echo "Has seleccionado Si, exit toma el valor de $?." else echo "Has seleccionado No, exit toma el valor de $?." fi
Cuadro de diálogo si/no personalizado
5.- CREAR DIÁLOGOS "INPUT"
Esta es la forma de tener un "formulario" con una caja de texto donde el usuario puede meter un texto. Además, debajo de la zona de input, existen 2 botones de OK/Cancel.
Sintaxis:
whiptail --title "" --inputbox ""
Mi ejemplo de input box:
#!/bin/bash FAVCAR=$(whiptail --title "TEST INPUT FORM BOX" --inputbox "Cual es tu marca preferida de coches?" 10 60 "Pon aqui la marca" 3>&1 1>&2 2>&3)
exitstatus=$? if [ $exitstatus = 0 ]; then echo "Tu marca preferida es:" $FAVCAR else echo "Seleccionaste cancelar." fi
Ejemplo de input box
6.- CREAR DIÁLOGOS "PASSWORD"
La forma de ocultar los caracteres que el usuario escribir en el "input" es a través de un password box. Además, dispone de un botón de OK y otro de Cancel.
Sintaxis:
whiptail --title "" --passwordbox ""
Mi ejemplo de password box:
#!/bin/bash PASSWORD=$(whiptail --title "PASSWORD TEXT BOX" --passwordbox "Introduce tu password y pulsa OK para continuar." 10 60 3>&1 1>&2 2>&3)
exitstatus=$? if [ $exitstatus = 0 ]; then echo "Tu password es:" $PASSWORD else echo "Has seleccionado cancelar." fi
Password box
7.- CREAR DIÁLOGOS "TEXT"
El cuadro de diálogo text box muestra el contenido de un fichero ó variable.
Cuando necesitamos presentar una serie de opciones al usuario, whiptail nos ofrece diversas formas de hacerlo.
Un menudebemos usarlo cuando queremos que el usuario selecciona una única opción de una lista, como por ejemplo su edad.
Los valores que podemos dar al cuadro ed diálogo de --menu son:
El texto introductorio del menú
El alto del cuadro de diálogo
El ancho del cuadro de diálogo
El alto del menú
El resto de las opciones son una lista de opciones del menú en el formato tag item, donde tag es el nombre de la opción mostrada en stderr cuando es seleccionada y el item es la descripción que sale en el menú.
Si el menú que queremos hacer es muy grande, debemos tener en cuenta las dimensiones del cuadro de diálogo y la del menú.
exitstatus=$? if [ $exitstatus = 0 ]; then echo "Has seleccionado la opcion:" $MENUOPCION else echo "Seleccionaste Cancelar." fi
Ejemplo de menu box
9.- CREAR DIÁLOGOS "CHECK LIST"
En este punto, queremos mostrar al usuario una serie de opciones sin limitación de cuantas puede seleccionar.
Una check list permite al usuario seleccionar más de una opción de menú.
Cuando el usuario confirma las opciones, la lista es mostrada en stderr.
Sintaxis:
whiptail --title "" --checklist "" [ ] . . .
Mi ejemplo de check list:
#!/bin/bash OPERATIVESYSTEM=$(whiptail --title "CHECKLIST BOX" --checklist \ "Selecciona tu S.O. preferido" 15 60 4 \ "Windows" "Usuarios habituales" OFF \ "Linux" "Les gusta ser diferentes" OFF \ "MAC OS" "No saben que es BSD" OFF \ "Otro" "Otros sistemas..." OFF 3>&1 1>&2 2>&3)
exitstatus=$? if [ $exitstatus = 0 ]; then echo "Mi Sistema Operativo preferido es:" $OPERATIVESYSTEM else echo "Seleccionaste Cancelar." fi
Ejemplo de check list
10.- CREAR DIÁLOGOS "RADIO LIST"
Un radio list es un cuadro de diálogo donde el usuario puede seleccionar una opción de entra las opciones posibles. La diferencia entre el radio list y el menu es que el selecciona una opción (usando la barra espaciadora) y luego tiene que confirmar pulsando OK:
Sintaxis:
whiptail --title "" --radiolist "" [ ] . . .
Mi ejemplo de radio list:
#!/bin/bash OPERATIVESYSTEM=$(whiptail --title "CHECKLIST BOX" --radiolist \ "Selecciona tu S.O. preferido" 15 60 4 \ "Windows" "Usuarios habituales" OFF \ "Linux" "Les gusta ser diferentes" OFF \ "MAC OS" "No saben que es BSD" OFF \ "Otro" "Otros sistemas..." OFF 3>&1 1>&2 2>&3)
exitstatus=$? if [ $exitstatus = 0 ]; then echo "Mi Sistema Operativo preferido es:" $OPERATIVESYSTEM else echo "Seleccionaste Cancelar." fi
Ejemplo de radio list
11.- CREAR DIÁLOGOS "PROGRESS GAUGE"
Un progress gauge es la barra de progreso de siempre. Podemos pasarle valores por stdin o a través de un script. En mi ejemplo, he creado una barra de progreso que dura 30 segundos.
Sintaxis:
whiptail --gauge []
Mi ejemplo de progress gauge:
#!/bin/bash { for ((i = 0 ; i = 30 ; i+=1)); do sleep 1 echo $i done } | whiptail --gauge "Esto es un contador de 30 segundos" 6 60 0
Si necesitas una Web para tu negocio, atractiva, llamativa y funcional, no lo dudes y contacta conmigo. Me adapto a cualquier requisito para tu negocio.
Comentarios
Los cuadros de diálogos se pueden crear con : dialog, whiptail, zenity etc etc ... En este tutorial he usado whiptail.
¿Que error te da exactamente?
Un saludo!