Este es el último artículo de una serie centrada en el scripting de Gnu Bash. En el primer artículo acabamos de crear un script simple con comandos, uno tras otro. También vimos el uso de algunas variables.
El segundo artículo cubrió algunas estructuras de control bash. El tercero cubrió redirecciones, canalizaciones y sustitución de comandos.
En este último (por ahora), mostraré cómo crear interfaces de usuario con diálogo en nuestros scripts.
Diálogo de instalación
La fuente se puede descargar para compilar desde aquí:https://invisible-island.net/dialog/. Para instalar binarios precompilados, su distribución seguramente tenga un paquete llamado 'dialog' que puede instalar con las herramientas del paquete.
Opciones generales
Las siguientes opciones se aplican a todos los widgets que podemos usar en el diálogo. Los que se enumeran aquí no son todos, pero son los que más uso.
- --líneas ascii En lugar de dibujar líneas de gráficos alrededor de los cuadros, "+" y "-" en el mismo lugar.
- --título título Especifica una cadena de título que se mostrará en la parte superior del cuadro de diálogo.
- --botón predeterminado cadena Establecer el botón preseleccionado en un widget. Normalmente, el primer botón de cada widget es el predeterminado.
- --elemento predeterminado cadena Establezca el elemento predeterminado en una lista de verificación, formulario o cuadro de menú.
- --sin líneas En lugar de dibujar líneas alrededor de los cuadros, dibuje espacios en el mismo lugar.
- --sin sombra Suprima las sombras que se dibujarían a la derecha y en la parte inferior de cada cuadro de diálogo
- --título posterior título posterior Especifica una cadena de título de fondo que se mostrará en la parte superior de la pantalla.
- --salida estándar Salida directa a la salida estándar. Útil para almacenar la elección o respuesta del usuario en una variable
Por ejemplo:
dialog --backtitle 'this is backtitle' --title 'Title' --infobox "This is just an infobox with some options settled" 0 0
produciría esta salida:

Otros ejemplos:




Mi sugerencia para los scripts con varias pantallas es agregar un alias con algunas opciones generales para que no tengas que escribir (o copiar) cada vez, así:
alias dialog="dialog --backtitle 'this is backtitle' --title 'Title' --stdout" dialog --infobox "This is just an infobox" 0 0
Algunos widgets
Infobox
Es el ejemplo de arriba. La sintaxis es:
--infobox text height width
Donde texto es el texto a mostrar, y alto y ancho son el tamaño del cuadro de diálogo. Puede usar la salida de un comando para texto con sustitución de comando, es decir, --infobox "$(cat somefile.txt)" . El tamaño se expresa en caracteres, un valor de 0 significa automático.
sí
Cuadro de estilo de consulta típico con botones de respuesta "Sí" y "No". La sintaxis es:
--yesno text height width
Podemos usarlo en un bloque if-then-else con un código como este:
if dialog --yesno "continue?" 0 0 then echo "You choose to continue" some_command some_other_command else echo "no" fi

menú
Una lista de desplazamiento de opciones con selección de entrada única. La sintaxis es:
--menu text height width menu-height tagX itemX tagY itemY
Cada entrada de menú consta de una cadena de etiquetas y una cadena de elementos. Me parece genial combinarlo con un bloque case-esac como en el siguiente ejemplo:
case $(dialog --menu "A menu of choices " 0 0 0 a item\ 1 b item\ 2 c item\ 3 d item\ 4) in a) echo "Item A" some commands ;; b) echo "Item B" some other commands ;; *) echo other ;; esac

cuadro de entrada
Un cuadro de entrada es útil cuando desea hacer preguntas que requieren que el usuario ingrese una cadena como respuesta. La sintaxis es:
--inputbox text height width [init]
inicio es opcional y se puede usar para establecer una respuesta predeterminada.

lista de control
Un cuadro de lista de verificación es similar a un cuadro de menú:hay múltiples entradas presentadas en forma de menú. Pero en lugar de elegir solo una entrada, cada entrada puede activarse o desactivarse. La sintaxis es:
--checklist text height width list-height tag item status
el estado puede estar activado o desactivado. Podemos trabajar con las opciones seleccionadas con un bucle for y un case block para evaluar las opciones seleccionadas. Ejemplo:
for i in $(dialog --checklist "A menu of choices " 0 0 0 a item\ 1 off b item\ 2 off c item\ 3 off ) do case $i in a) echo "item 1 selected" ;; b) echo "item 2 selected" ;; c) echo "item 3 selected" ;; esac done

Una alternativa es la lista de radio donde el usuario puede elegir solo un elemento.
calibre
Una barra de progreso típica. El medidor indica el porcentaje. Los nuevos porcentajes se leen de la entrada estándar, un número entero por línea. La sintaxis es:
--gauge text height width [percent]
El porcentaje es opcional y representa el porcentaje inicial hecho. Esto se puede utilizar con tuberías. Por ejemplo:
seq 1 100|dialog --gauge "A gauge" 0 0

Calendario
Un cuadro de calendario muestra el mes, el día y el año. La sintaxis es:
--calendar text height width day month year
Si los valores de día, mes o año faltan o son negativos, se utiliza la fecha actual.

Dónde ir desde aquí
Acabo de mostrar algunos de los widgets disponibles (hay más de veinte). La página de manual de diálogo brinda ayuda para todos ellos.
Por supuesto, el diálogo no es la única herramienta disponible para crear interfaces de usuario de texto. Hay alternativas como Xdialog, Whiptail (ambos mencionados en la página de manual del diálogo) o Zenity. Recuerda que hay más de una forma de hacerlo.
Esta serie de cuatro artículos sobre bash scripting está muy, muy, muy lejos de estar completa. Mi intención es hacerte sentir lo suficientemente curioso como para investigar por ti mismo. Tenga a mano la página de manual de bash (que a veces puede ser confuso, al menos para mí). Y tenga más cerca de usted la Guía avanzada de secuencias de comandos de Bash para obtener una guía más completa, llena de ejemplos.