Mi Blog
Cómo crear cuadros de diálogo en tus scripts de GNU/Linux

Cómo crear cuadros de diálogo en tus scripts de GNU/Linux

(10 votos)

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.

⬇️ Compra en Amazon el hardware que utilizo ⬇️

🔥 ¡DESCÚBRELOS! 🔥

 

 

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

Cuadro de DialogoInfo 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.

Sintaxis:

whiptail --title "" --infobox ""  

Mi ejemplo de message box:

whiptail --title "EJEMPLO MESSAGE BOX" --infobox "Pulsa  para salir" 8 78

Cuadro de DialogoMessage Box

 

 

4.- CREAR DIÁLOGOS "YES/NO"

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 DialogoCuadro 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 DialogoCuadro 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 aquí la marca" 3>&1 1>&2 2>&3)

exitstatus=$?
if [ $exitstatus = 0 ]; then
echo "Tu marca preferida es:" $FAVCAR
else
echo "Seleccionaste cancelar."
fi

Cuadro de DialogoEjemplo 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

Cuadro de DialogoPassword box

7.- CREAR DIÁLOGOS "TEXT"

El cuadro de diálogo text box muestra el contenido de un fichero ó variable.

Sintaxis:

whiptail --textbox   

Mi ejemplo de text box:

#!/bin/bash
echo "Mi kernel es\n"`uname -a` > contenido_textbox
whiptail --textbox contenido_textbox 12 80

Cuadro de DialogoEjemplo de text box

 

 

8.- CREAR DIÁLOGOS "MENU"

Cuando necesitamos presentar una serie de opciones al usuario, whiptail nos ofrece diversas formas de hacerlo.

Un menu debemos 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ú.

Sintaxis:

whiptail --title "
" --menu ""  
 [   ] . . .

Mi ejemplo de menu box:

#!/bin/bash
MENUOPCION=$(whiptail --title "MENU BOX" --menu "Selecciona un color" 15 60 4 \
"1" "Rojo" \
"2" "Verde" \
"3" "Azul" \
"4" "Rosa" 3>&1 1>&2 2>&3)

exitstatus=$?
if [ $exitstatus = 0 ]; then
echo "Has seleccionado la opcion:" $MENUOPCION
else
echo "Seleccionaste Cancelar."
fi

Cuadro de DialogoEjemplo 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

Cuadro de DialogoEjemplo 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

Cuadro de DialogoEjemplo 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

Cuadro de DialogoEjemplo de progress gauge

ENJOY!


Acerca de Mi

RPF

Soy Ingeniero Téc. Industrial Mecánico, Administrador de Sistemas Informáticos, Desarrollador de Aplicaciones Informaticas Web, Técnico Superior en PRL, Experto en Energías Renovables... y trabajo actualmente como Senior DevOPS en HP SCDS.

Contactar conmigo

Dirección: León, España

E-Mail: Contactar

Web: https://www.raulprietofernandez.net

Skype: raul.lnx

APÚNTATE GRATIS

VIP RPF
Entra en la Comunidad VIP y consigue acceso a las descargas en PDF, Trucos y Videotutoriales ocultos y mucho más... ¡Muy Pronto!