7 de Junio, 2005

Funciones en un script shell

Vamos a echarle un vistazo a cómo se trabaja con funciones en un bourne shell.

La verdad es que casi nunca necesito usarlas y, por lo tanto, tampoco me he planteado hacer una librería de funciones comunes, lo cual podría ser útil a medio/largo plazo.

Hay dos formas de definir las funciones:

# con la palabra reservada 'function'
function suma_a
{
        return $(($1+$2))
}

# o empleando los paréntesis
suma_b()
{
        return $(($1+$2))
}

# se invocan igual
suma_a 10 3
a=$?
suma_b 10 3
b=$?

# y el resultado es el mismo
echo $a y $b

Como se puede observar las funciones devuelven un valor empleando return, y se puede acceder a los argumentos con los que son invocadas mediante algunas variables predefinidas ($# para el número de argumentos, $@ para todos los argumentos, $1 para el primero, $2 para el segundo, etc.).

Podemos emplear las funciones también desde un shell interactivo. Supongamos la siguiente función en un fichero llamado mifuncion:

llamame()
{
        echo $# argumentos
        echo todo: $@

        # si no empleamos 'in' se asume 'in $@'
        for i; do
                echo argumento: $i

                # siguiente argumento, por favor
                shift
        done
}

Ahora la podemos incluir en un shell en ejecución con el comando source (o el punto). También es útil para incluir ficheros con funciones dentro de otros para que las usen.

Vamos a cargar el fichero y a ejecutar la función que contiene:

$ . mifuncion
$ llamame uno dos tres cuatro
4 argumentos
todo: uno dos tres cuatro
argumento: uno
argumento: dos
argumento: tres
argumento: cuatro

Esto nos puede permitir personalizar nuestro shell de forma casi ilimitada, creando nuestros propios comandos con el detalle que necesitemos. Solo tendremos que incluir nuestras funciones en uno de los ficheros que se procesan al arrancar el shell ($HOME/.profile, o $HOME/.bash_profile en caso de BASH).

El año pasado di un taller de programación shell, y como solo disponía de 4 horas, simplifiqué mucho dejando las funciones completamente fuera de temario. La verdad es que es una lástima, pero por algún sitio había que cortar :(.

Anotación por Juan J. Martínez.

Hay 2 comentarios

Gravatar

Excelente el artículo, para ser sincero no conocía la capacidad de inclusión de manera interactiva de funciones en bourne shell. Ya le veo ciertas aplicaciones locales, por lo menos reducire la cantidad de scripts cortos hechos por mi que he ubicado en el directorio /usr/local/bin.

por MilMazz, en 2005-06-09 07:27:44

Gravatar

Se me ocurre que si es muy grande o no lo usas confrecuencia, es memoria que ocupará en el shell interactivo llames o no a esa función.

De todas formas... 64 KBs de script ya es un tocho enorme (no creo que nadie se ponga a hacer funciones de servicio de ese tamaño) y ¿qué son 65536 bytes hoy día cuando la memoria se empieza a medir en gigabytes? ;) pero tenía que decirlo :D

por Juanjo, en 2005-06-09 09:33:49

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.