En nuestro último artículo, repasamos algunos trucos fáciles de usar para hacer scripts de shell simples pero útiles. Ahora nos sumergiremos un poco más y les añadiremos algo de inteligencia.
Uso de condicionales
Si recuerdas el script que escribimos la última vez, ejecutaba una serie de comandos que utilizaban Pandoc para generar cuatro versiones de un documento Markdown (en cada uno de los formatos HTML, DOCX, ODT y ePub). Pero esto era todo o nada… o bien utilizábamos el propio Pandoc para hacerlas de una en una, o bien todas. ¿Y si quisiéramos elegir?
Esto es sencillo utilizando condicionales, que son básicamente declaraciones “si X es esto, entonces haz esto“. Echemos un vistazo al script tal y como lo teníamos:
#!/bin/bashpandoc -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 rápida modificación del script pandoc-pub.sh como esta logrará precisamente eso:
#!/bin/bashfile=$1export=$2if[“$export” == “html”]then pandoc -r markdown -w html -o$file.html $fileelif[“$export” == “docx”]then pandoc -r markdown -w docx -o$file.docx $fileelif[“$export” == “odt”]then pandoc -r markdown -w odt -o$file.odt $fileelif[“$export” == “epub”]then pandoc -r markdown -w epub -o$file.epub $filefi
Lo primero que hemos hecho aquí es dar nombres a las dos variables que queremos de la línea de comandos: file (que es el archivo fuente de Markdown), y export (que es el formato al que queremos exportar. Así que ahora podemos elegir lo que queremos generar con
pandoc-pub.sh [archivo que quieres convertir].md [uno de “html”, “docx”, “odt” o “epub”]
¿Pero qué pasa con todo el conjunto? ¿Podemos hacerlo 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) introduzca algo además de las cuatro opciones anteriores – en este caso, ¿por qué no exportar todo? Añade un poco más de código como sigue
#!/bin/bashfile=$1export=$2if[“$export” == “html”]then pandoc -r markdown -w html -o$file.html $fileelif[“$export” == “docx”]then pandoc -r markdown -w docx -o$file.docx $fileelif[“$export” == “odt”]then pandoc -r markdown -w odt -o$file.odt $fileelif[“$export” == “epub”]then pandoc -r markdown -w epub -o$file.epub $fileelse 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 $filefi
Ahora, si no introducimos nada después del nombre del archivo en la línea de comandos (o algo incorrecto), este script hará lo más seguro y generará todos los formatos.
Añadir una GUI
Pero qué pasa si, en este último caso, no quieres que simplemente genere todo, sino que haga algo más útil. Podríamos añadir otro
elif
para generar todos los formatos cuando se introduce “all” en la línea de comandos, y cambiar la sentencia para imprimir algún texto de ayuda:
#!/bin/bashfile=$1export=$2if[“$export” == “html”]then pandoc -r markdown -w html -o$file.html $fileelif[“$export” == “docx”]then pandoc -r markdown -w docx -o$file.docx $fileelif[“$export” == “odt”]then pandoc -r markdown -w odt -o$file.odt $fileelif[“$export” == “epub”]then pandoc -r markdown -w epub -o$file.epub $fileelif[“$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 $fichero&& pandoc -r markdown -w epub -o$fichero.epub $ficheroelseecho “Por favor, añada una de las siguientes opciones después del nombre del fichero: html, odt, docx, epub, o todas. “fi
Pero será más útil que, en caso de que la bandera esté en blanco o sea incorrecta, mostremos una GUI para ayudar al usuario. En primer lugar, tendremos que instalar un conjunto de herramientas llamado Zenity para ayudarnos.
Puede instalarlo desde el Centro de Software, o utilizar el siguiente comando:
sudoapt-get install zenity
A continuación, necesitaremos usar Zenity para crear un diálogo para nosotros. Querremos algo en lo que el usuario pueda seleccionar todas o algunas de las opciones que tenemos disponibles… las casillas de verificación parecen lo más adecuado en este caso. Así que creamos un diálogo Zenity con casillas de verificación que representan todas nuestras opciones:
#!/bin/bashzenity –list–checklist–title=”Pandoc Publisher”–column=””–column=”Export Format” FALSE “html” FALSE “odt” FALSE “docx” FALSE “epub”
Puedes ver cómo se construye el anterior comando de Zenity leyendo el manual aquí. A continuación, necesitamos obtener la lista de lo que el usuario compruebe, y asignarla a una variable. Añadiendo un nombre de variable, y envolviendo el comando Zenity entre paréntesis, y añadiendo un signo “$” le dirá al shell que reemplace el comando de dentro con su resultado cuando haya terminado:
#!/bin/bashchoices=$(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 comprobar si esa lista contiene alguno de los formatos que pensamos manejar utilizando “=~” en lugar de “==” (esto comprueba si algo contiene otra cosa, en este caso)… por ejemplo
if[[$elecciones =~ “html”]]
Por último, una rápida modificación del script mostrará este diálogo cuando no se proporcione ningún formato, y luego ejecutará el comando Pandoc apropiado cuando se marque esa opción en el diálogo:
#!/bin/bashfile=$1export=$2if[“$export” == “html”]then pandoc -r markdown -w html -o$file.html $fileelif[“$export” == “docx”]then pandoc -r markdown -w docx -o$file.docx $fileelif[“$export” == “odt”]then pandoc -r markdown -w odt -o$file.odt $fileelif[“$export” == “epub”]then pandoc -r markdown -w epub -o$file.epub $fileelif[“$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 $archivo&& pandoc -r markdown -w epub -o$archivo.epub $fileelsechoices=$(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; fiif[[$choices =~ “odt”]]then pandoc -r markdown -w docx -o$file.docx $file; fiif[[$choices =~ “docx”]]then pandoc -r markdown -w odt -o$file.odt $file; fiif[[$choices =~ “epub”]]then pandoc -r markdown -w epub -o$file.epub $file; fifi
Así de fácil, una aplicación personalizada con GUI y opciones de línea de comandos.