Crea diálogos y scripts para tus scripts Bash. 2º parte

En la entrega anterior vimos diálogos básicos para ir entrando en materia. En esta nueva entrega enseñare diálogos que nos servirán para pedir datos al usuario y como obtenerlos para usarlos en nuestro script

Diálogos de entrada:

Los diálogos de entrada nos permiten pedir al usuario un dato, por ejemplo, su nombre, una dirección, etc

dialog --title 'Su nombre' --inputbox "¿Cual es su nombre?" 0 0; clear

inputbox en Dialog

Este ejemplo una vez que pulsamos en Aceptar se cierra y no muestra nada. ¿Como obtenemos entonces lo que introduce el usuario?. Pues guardándolo en una variable:

#!/bin/bash
nombre=$(dialog --title 'Su nombre' --stdout --inputbox "¿Cual es su nombre?" 0 0)
if [ -n $nombre ]; then
	dialog --title 'Su nombre' --msgbox $nombre 0 0
fi
clear

Para obtener la salida de un comando debemos de meterlo entre $() o ``, aunque no se que ventajas tiene uno sobre el otro. Ademas he introducido un nuevo parámetro, --stdout, para indicar que saque el dialogo por la salida estándar, ya que de lo contrario no veríamos nada. Luego comprobamos si $nombre contiene algún valor (se introdujo un valor y se pulso Aceptar) y lo mostramos.

En Kdialog es similar:

#!/bin/bash
nombre=$(kdialog --title 'Su nombre' --inputbox "¿Cual es su nombre?")
if [ -n $nombre ]; then
	kdialog --title 'Su nombre' --msgbox $nombre
fi

Inputbox en Kdialog

Zenity:

#!/bin/bash
nombre=$(zenity --entry --title "Su nombre" --text "¿Cual es tu nombre?")

if [ ! -z $nombre ]; then
	zenity --info --title "Su nombre" --text $nombre
fi

Inputbox en Zenity

Zenity no cuenta con un diálogo de entrada como Dialog y Zenity, si no que tiene uno para un dialogo de formularios, pero es algo que ya veremos más adelante.

Diálogos de contraseña:

Es posible que en algún script necesitemos que el usuario introduzca una contraseña en un momento dado, por ejemplo, para conectarse a un servidor remoto y obtener unos datos.

#!/bin/bash
pass=stallman
passwd=$(dialog --title 'Su contraseña' --stdout --passwordbox 'Introduzca su contraseña' 0 0)
if [[ ! -z $passwd ]; then
	if [ $pass = $passwd ]; then
		dialog --title 'Correcta' --msgbox 'Contraseña correcta' 0 0
	else
		dialog --title 'Incorrecta' --msgbox 'Contraseña incorrecta' 0 0
	fi
fi
clear

Passwordbox en Dialog

Como pasa con muchos programas de linea de comandos, como su o sudo, no se muestra nada mientras se introduce la contraseña, por lo que nadie ve cuantos caracteres ha introducido. Si queremos mostrar los tipicos asteriscos podemos añadir el parámetro --insecure:

Passwordbox inseguro en Dialog

En Kdialog es de la siguiente manera:

#!/bin/bash
pass=stallman
passwd=$(kdialog --title 'Su contraseña' --password 'Introduzca su contraseña')
if [ -n $nombre ];then
	if [ $pass = $passwd ]; then
		kdialog --title 'Correcta' --msgbox 'Contraseña correcta'
	else
		kdialog --title 'Incorrecta' --error 'Contraseña incorrecta'
	fi
fi

Passwordbox en Dialog

Y en Zdialog:

#!/bin/bash
pass=stallman
passwd=$(zenity --title 'Su contraseña' --password 'Introduzca su contraseña')
if [ ! -z $passwd ]; then
	if [ $pass = $passwd ]; then
		zenity --info --title 'Correcta' --text 'Contraseña correcta'
	else
		zenity --error --title 'Incorrecta' --text 'Contraseña incorrecta'
	fi
fi

Passwordbox en Zenity

Este ultimo tiene un parámetro opcional que muestra un campo de nombre de usuario, --username, evitando así que tengamos que usar dos diálogos para solicitar ambos datos si los necesitamos:

#!/bin/bash
usuario=torvals
pass=stallman
user=$(zenity --title 'Su contraseña' --password 'Introduzca su contraseña' --username)
if [ ! -z $user ]; then
	# Zenity devuelve ambos campos separados por |
	usu=$(echo $user | cut -d'|' -f1)
	passwd=$(echo $user | cut -d'|' -f2)
	if [ $usuario = $usu ] && [ $pass = $passwd ]; then
		zenity --info --title 'Correcta' --text 'Usuario y contraseña correcta' --ellipsize
	else
		zenity --error --title 'Incorrecta' --text 'Usuario y/o contraseña incorrecta' --ellipsize
	fi
fi

Passwordbox con nombre de usuario en Zenity

Cajas de texto:

Es posible que en algún momento necesitemos mostrar al usuario el contenido de un archivo de texto, por ejemplo, el resultado de una operación, un log, la licencia que usa nuestro proyecto, etc.

dialog --title 'Lore Impsum' --textbox <archivo> 0 0; clear

Textbox en Dialog

Siendo <archivo> la ruta el fichero, por ejemplo:

#!/bin/bash
dialog --title 'Lore Impsum' --textbox loreipsum.txt 0 0; clear

Si el texto es más grande podemos movernos usando las teclas de flecha.

En Kdialog es:

#!/bin/bash
kdialog --title 'Lore Imsum' --textbox loreipsum.txt

Textbox en Dialog

Y por ultimo en Zenity:

#!/bin/bash
zenity --text-info --title 'Lore Ipsum' --filename loreipsum.txt

Textbox en Zenity

Este ultimo dispone de varios parámetros opcionales, como activar soporte para HTML o que sea editable, pero eso es algo que dejo para más adelante.

Y esto es todo por el momento. Hasta la próxima entrega. Espero que estos tutoriales os sean de utilidad, y podéis usar los comentarios para dejar dudas, opiniones, etc

Share: