Retorno de valores en funciones de Bash

El lenguaje de scripting de bash permite el uso de funciones que deben estar declaradas siempre antes de ser llamadas, pero a diferencia de otros lenguajes, no permite retornar valores. Siempre que una función de bash finaliza devuelve el valor de estado de salida, RC o $?, que es cero en caso de ejecución correcta y cualquier otro valor en caso de error.

Aquí se describen algunas formas de retornar valores. Se suelen usar variables globales, pero también se pueden usar sustitución de comandos o se puede pasar una variable donde el resultado estará cargado.

Variable global

El método común y más simple es cargar una variable global, pues en bash todas las variables son globales (salvo definición explícita de local):

function mifuncion()
{
    RESULTADO='un valor'
}

mifuncion
echo $RESULTADO

Simple y claro. Pero las variables globales se vuelven complejas de manejar en códigos extensos, principalmente a la hora de encontrar errores de ejecución.

Entonces es posible usar variables locales a las funciones, pero el problema es devolver el valor al código que llamó a la función.

Sustitución de comando (STDOUT)

function mifuncion()
{
    local  miresultado='un valor'
    echo "$miresultado"
}

RESULTADO=$(mifuncion)   # o RESULTADO=`mifuncion`
echo $RESULTADO

Aquí el resultado se muestra en STDOUT y se produce la sustitución del comando al llamar a la función para cargarlo en una variable.

Pasar una variable (eval)

Otra forma de pasar un resultado es escribir la función para que reciba una variable al ser llamada y entonces cambiar el valor de la variable como resultado de la función:

function mifuncion()
{
    local  __resultadovar=$1
    local  miresultado='un valor'
    eval $__resultadovar="'$miresultado'"
}

mifuncion RESULTADO
echo $RESULTADO

Aqui lo que hacemos es guardar el nombre de una variable en una variable; por eso no podemos configurar la variable directamente, necesitamos usar eval para configurarla. El comando eval le dice a bash que interprete la linea dos veces: la primera vez devuelve el string miresultado=’un valor’, el cual es interpretado una vez mas para obtener el valor de la variable.

Cuando se guarda el nombre de una variable que se pasa en al linea de comando, debemos asegurarnos que es guardado en una variable de tipo local (local __resultadovar=$1) con un nombre que no sea usado cuando se llama a la función (por eso el nombre __resultadovar). Si no tenemos cuidado con esto, y se usa el mismo nombre de variable, la variable de resultado no será cargada; por ejemplo, lo siguiente no funciona:

function mifuncion()
{
    local  RESULTADO=$1
    local  miresultado='un valor'
    eval $RESULTADO="'$miresultado'"
}

mifuncion RESULTADO
echo $RESULTADO

La razón por la que no funciona es que cuando eval realiza la segunda interpretación evalúa RESULTADO=’un valor, pero RESULTADO es en ese momento una variable local a la función, y entonces queda establecida así, en lugar de configurar la variable que se pasa al llamar a la función.

Otra precaución para evitar este funcionamiento no deseado, es utilizar variables en mayúsculas cuando son globales y minúsculas cuando son locales.

Para mayor flexibilidad, las funciones pueden ser escritas para combinar ambos métodos:

function mifuncion()
{
    local  __resultadovar=$1
    local  miresultado='un valor'
    if [[ "$__resultadovar" ]]; then
        eval $__resultadovar="'$miresultado'"
    else
        echo "$miresultado"
    fi
}

mifuncion RESULTADO
echo $RESULTADO
RESULTADO2=$(mifuncion)
echo $RESULTADO2

Entonces, si ninguna variable es pasada a la función, el valor de salida es colocado en STDOUT.

Basado (casi traducción textual) del artículo del 2009 de Mitch Frazier, publicado en Linux Journal con el título «Returning Values from Bash Functions«, pues ha sido el artículo con el que comprendí claramente cómo gestionar las funciones en bash.

FLISOL 2010 en Carmelo

flisol_2010

Un año más que tengo la suerte de ser invitado por los organizadores del FLISOL en la ciudad de Carmelo, Departamento de Colonia, para participar durante toda la jornada del próximo sábado 24 de mayo.

Afiche_FLISOL_2010_Carmelo_Colonia

Cada año que voy a Carmelo, me sorprendo de la excelente organización que realzia la gente de Adec Informática, ellos son una academia de enseñanza de informática que funciona 100% sobre plataforma Linux, y se nutren constantemente de un sistema operativo y herramientas libres.

En representación del UYLUG estaré presentando cuáles son las ventajas de aprovechar las XO para fomentar la creatividad y la curiosidad de los niños; en particular la actividad Terminal y la programación Python. Me acompañan desde Montevideo los Profesores Diego Roselli y Fernando Da Rosa.

Otros amigos del UYLUG estarán en otras ciudades:

seguro me olvido de alguien, pues este es el año que se realiza en más ciudades de Uruguay, un total de ocho ciudades. Por supuesto un grueso de activistas del Software Libre quedan en Montevideo, en una jornada que brillará por si misma y por los invitados internacionales.

Todo esto nos presenta un festival que cada año se supera.

Ceibal JAM 2

El próximo sábado 30 de agosto y el siguiente sábado 6 de setiembre se realizará la segunda edición del Ceibal JAM en los laboratorios de informática de la Universidad Católica Dámaso A. Larrañaga.

El CeibalJAM es un movimiento social independiente de afiliación abierta y voluntaria, que busca nuclear a todos quienes tengan interés en contribuir al desarrollo de software con utilidad potencial para el Plan Ceibal; es un esfuerzo por desarrollar la capacidad local de crear nuevas aplicaciones y modificar las existentes para que atiendan a las necesidades específicas de la realidad uruguaya.

Ya hay algunas ideas de proyectos a impulsar en esas dos jornadas de trabajo, pero obviamente, estamos abiertos a cualquier idea o aporte. Por otro lado, en la agenda de esos días hay incluídos tutoriales en varios niveles, para los que no conocen programación para las XO.

Sin dudas, este CeibalJAM 2 se perfila como un motivador e interesante evento para cooperar con innovación nacional.

Google Summer of Code

Google Summer of Code es el patrocinio de Google a la comunidad de Software Libre, mediante el apoyo con dinero en efectivo y recursos para que programadores del mundo entero puedan mejorar distintos proyectos de Software Libre y recibir una remuneración por hacerlo.

Adriano Monteiro Marques ya ha participado varias veces y creado un video explicativo. Aquí su traducción al español:

Recuerdo cuando en el Foro Internacional de Software Libre del año 2006, la comunidad le agradeció a por Google su apoyo:

GSC

Me gustaria que programadores uruguayos participen de esta iniciativa, no solo por lo que recibirían de pago, sino por la experiencia de acercarse a un proyecto de software internacional, con perspectivas interesantes. No he visto en las universidades de mi ciudad «movimiento» alrededor de esto, claro que nunca es tarde para comenzar y fomentar en los estudiantes avanzados la participación en este tipo de iniciativas.