Shell scripting con Ruby

10 11 2008

Aunque para la automatización de tareas se suele recurrir a bash o ksh, en definitiva la shell por defecto, también es fácil encontrarse con scripts realizados en Perl. Pero en el ámbito del software libre han surgido lenguajes modernos que nos pueden resultar atractivos por la funcionalidad que aportan, sencillez o simplemente sana curiosidad.

Dos de los nuevos lenguajes que han ganado popularidad recientemente son Python y Ruby. En este post vamos a comentar cómo realizar un sencillo script que nos simplifique la tarea de generar salidas en HTML, XML o PDF a partir de un XML original en DocBook 5.

Nuestro script, recibirá al menos un parámetro de entrada (“clean” para limpiar el directorio de trabajo) o dos (formato de salida: “html”, “xhtml” o “pdf”, y nombre del fichero sin extensión).

#!/usr/bin/ruby
print "procesador DocBook - JM 2008\n"
XSLEXE = "xsltproc --output "
HTMEXE = ".html --stringparam generate.toc 0 /sw/share/xml/xsl/docbook-xsl/html/docbook.xsl "
PDFEXE = ".fo --stringparam paper.type A4 --stringparam generate.toc 0 /sw/share/xml/xsl/docbook-xsl/fo/docbook.xsl "
XHTEXE = ".xhtml --stringparam generate.toc 0 /sw/share/xml/xsl/docbook-xsl/xhtml/docbook.xsl "
ejecutable = case $*[0]
when "html" : XSLEXE + $*[1] + HTMEXE + $*[1] + ".xml"
when "pdf" : XSLEXE + $*[1] + PDFEXE + $*[1] + ".xml"
when "xhtml" : XSLEXE + $*[1] + XHTEXE + $*[1] + ".xml"
when "clean" : "rm *.fo *.pdf *.html *.xhtml"
else
print "sintaxis: opciones nombre_fichero_sin_extensión\n"
print "opciones: html, pdf y xhtml\n"
exit
end
system(ejecutable)
print "\n"
if $*[0] == "pdf"
ejecutable = "java org.apache.fop.cli.Main -fo " + $*[1] + ".fo -pdf " + $*[1] + ".pdf"
system(ejecutable)
print "\n"
end
print "finalizando procesado\n"

 
Como es habitual en los shell scripts, la primera línea es para invocar al intérprete Ruby.

Se han definido una series de constantes, en mayúsculas, que se usan en la sentencia CASE para componer las diferentes órdenes (mediante concatenación de strings con el operador +).

Y la variable $*, que realmente es un array, almacena los diferentes parámetros recibidos por línea de comandos: $*[0] para la opción y $*[1] para el nombre del fichero.

La invocación de comandos externos se realiza mediante el comando system, mientras que el salto de línea (\n) se incluye para hacer bonita la salida.

Diferentes ejecuciones:
./miscript.rb clean
./miscript.rb xhtml fichero