zenity-dialog

Más sobre Shell Script: agregar condiciones y GUI

En nuestro último artículo, repasamos algunos trucos fáciles de usar para crear scripts de shell simples pero útiles. Ahora profundizaremos un poco más y les agregaremos algo de inteligencia.

Uso de condicionales

Si recuerda el script que escribimos la última vez, ejecutó una serie de comandos que usaban Pandoc para generar cuatro versiones de un documento Markdown (en HTML, DOCX, ODT y ePub). Pero esto era todo o nada… o usamos el propio Pandoc para hacerlos uno a la vez, o bien todos. ¿Y si quisiéramos escoger y elegir?

Esto es simple usando condicionales, que son básicamente declaraciones «si X es esto, entonces haz esto». Echemos un vistazo al script como lo teníamos:

#!/bin/bash
pandoc -r markdown -w html -o $1.html $1 &&
pandoc -r markdown -w docx -o $1.docx $1 &&
pandoc -r markdown -w odt -o $1.odt $1 &&
pandoc -r markdown -w epub -o $1.epub $1

Supongamos que queremos poder elegir uno de los elementos anteriores en la línea de comandos, o hacerlos todos. Una modificación rápida de la secuencia de comandos pandoc-pub.sh como esa logrará precisamente eso:

#!/bin/bash
file=$1
export=$2
if [ "$export" == "html" ]
then
  pandoc -r markdown -w html -o $file.html $file
elif [ "$export" == "docx" ]
then
  pandoc -r markdown -w docx -o $file.docx $file
elif [ "$export" == "odt" ]
then
  pandoc -r markdown -w odt -o $file.odt $file
elif [ "$export" == "epub" ]
then
  pandoc -r markdown -w epub -o $file.epub $file
fi

Lo primero que hicimos aquí fue dar a las dos variables que queremos de los nombres de la línea de comandos: archivo (que es el archivo fuente de Markdown) y exportación (que es el formato al que queremos exportar. Así que ahora podemos seleccionar y elegir lo que queremos generar usando:

pandoc-pub.sh [file you want to convert].md [one of either "html," "docx," "odt," or "epub"]

Pero ¿qué pasa con todo el tinglado? Podríamos hacer eso la última vez, ¿pero no ahora? Bueno, si pensamos un poco en el futuro, deberíamos tener en cuenta un caso en el que nosotros (u otro usuario) ingrese algo además de las cuatro opciones anteriores; en este caso, ¿por qué no exportar todo? Agregue un bit más de código de la siguiente manera:

#!/bin/bash
file=$1
export=$2
if [ "$export" == "html" ]
then
  pandoc -r markdown -w html -o $file.html $file
elif [ "$export" == "docx" ]
then
  pandoc -r markdown -w docx -o $file.docx $file
elif [ "$export" == "odt" ]
then
  pandoc -r markdown -w odt -o $file.odt $file
elif [ "$export" == "epub" ]
then
  pandoc -r markdown -w epub -o $file.epub $file
else
  pandoc -r markdown -w html -o $file.html $file &&
  pandoc -r markdown -w docx -o $file.docx $file &&
  pandoc -r markdown -w odt -o $file.odt $file &&
  pandoc -r markdown -w epub -o $file.epub $file
fi

Ahora, si no ingresamos nada después del nombre del archivo en la línea de comando (o algo incorrecto), este script solo hará lo seguro y generará todos los formatos.

Agregar una GUI

Pero qué pasa si, en este último caso, no quieres que solo genere todo, sino que haga algo más útil. Podríamos agregar otro

declaración para generar todos los formatos cuando se ingresa «todos» en la línea de comando, y cambie la declaración para imprimir algún texto de ayuda:

#!/bin/bash
file=$1
export=$2
if [ "$export" == "html" ]
then
  pandoc -r markdown -w html -o $file.html $file
elif [ "$export" == "docx" ]
then
  pandoc -r markdown -w docx -o $file.docx $file
elif [ "$export" == "odt" ]
then
  pandoc -r markdown -w odt -o $file.odt $file
elif [ "$export" == "epub" ]
then
  pandoc -r markdown -w epub -o $file.epub $file
elif [ "$export" == "all" ]
then
  pandoc -r markdown -w html -o $file.html $file &&
  pandoc -r markdown -w docx -o $file.docx $file &&
  pandoc -r markdown -w odt -o $file.odt $file &&
  pandoc -r markdown -w epub -o $file.epub $file
else
  echo "Please add one of the following options after the filename: html, odt, docx, epub, or all."
fi

Pero será más útil que, en caso de una bandera en blanco o incorrecta, mostremos una GUI para ayudar al usuario. Primero, necesitaremos instalar un conjunto de herramientas llamado zenidad Para ayudarnos. Puede instalarlo desde el Centro de software o utilizar el siguiente comando:

sudo apt-get install zenity

A continuación, necesitaremos usar Zenity para crear un diálogo para nosotros. Querremos algo donde el usuario pueda seleccionar todas o algunas de las opciones que tenemos disponibles… las casillas de verificación suenan como lo correcto aquí. Entonces creamos un cuadro de diálogo Zenity con casillas de verificación que representan todas nuestras opciones:

#!/bin/bash
zenity --list --checklist --title="Pandoc Publisher" --column="" --column="Export Format" FALSE "html" FALSE "odt" FALSE "docx" FALSE "epub"

zenity-diálogo

Puede ver cómo el comando Zenity anterior está construido por leyendo el manual aquí. A continuación, necesitamos obtener la lista de lo que el usuario marque y asignarlo a una variable. Agregar un nombre de variable, envolver el comando Zenity entre paréntesis y agregar un signo «$» le indicará al shell que reemplace el comando dentro con su resultado cuando haya terminado:

#!/bin/bash
choices=$(zenity --list --checklist --title="Pandoc Publisher" --column="" --column="Export Format" FALSE "html" FALSE "odt" FALSE "docx" FALSE "epub");

Ahora tenemos una variable “$opciones” que contiene una lista (separada por “|” por defecto) de todas las opciones seleccionadas. Tendremos que verificar si esa lista contiene alguno de los formatos que planeamos manejar usando «=~» en lugar de «==» (esto verifica si algo contiene algo más, en este caso)… para ejemplo:

if [[ $choices =~ "html" ]]

Por último, una modificación rápida de la secuencia de comandos mostrará este cuadro de diálogo cuando no se proporcione ningún formato, luego ejecute el comando Pandoc apropiado cuando esa opción esté marcada en el cuadro de diálogo:

#!/bin/bash
file=$1
export=$2
if [ "$export" == "html" ]
then
  pandoc -r markdown -w html -o $file.html $file
elif [ "$export" == "docx" ]
then
  pandoc -r markdown -w docx -o $file.docx $file
elif [ "$export" == "odt" ]
then
  pandoc -r markdown -w odt -o $file.odt $file
elif [ "$export" == "epub" ]
then
  pandoc -r markdown -w epub -o $file.epub $file
elif [ "$export" == "all" ]
then
  pandoc -r markdown -w html -o $file.html $file &&
  pandoc -r markdown -w docx -o $file.docx $file &&
  pandoc -r markdown -w odt -o $file.odt $file &&
  pandoc -r markdown -w epub -o $file.epub $file
else
  choices=$(zenity --list --checklist --title="Pandoc Publisher" --column="" --column="Export Format" FALSE "html" FALSE "odt" FALSE "docx" FALSE "epub");
  if [[ $choices =~ "html" ]]
  then
    pandoc -r markdown -w html -o $file.html $file;
  fi
  if [[ $choices =~ "odt" ]]
  then
    pandoc -r markdown -w docx -o $file.docx $file;
  fi
  if [[ $choices =~ "docx" ]]
  then
    pandoc -r markdown -w odt -o $file.odt $file;
  fi
  if [[ $choices =~ "epub" ]]
  then
    pandoc -r markdown -w epub -o $file.epub $file;
  fi
fi

Así de simple, una aplicación personalizada con GUI y opciones de línea de comandos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Experto Geek - Tu Guía en Tendencias Tecnológicas