5.5.- Funciones

Las funciones sirven para agrupar comandos que tienen que ser ejecutados en varios sitios durante el transcurso de la ejecución de un script.

Definición de una función

Para definir una función, la tenemos que hacer antes de su primera llamada.

Primera sintaxis

Para llamar a la función, solo tenemos que llamarla con el mismo nombre que se ha creado.

Segunda sintaxis

Una palabra clave function reemplaza los paréntesis «( )» usados en la primera sintaxis.

La llamada a la función es la misma :

En un script con funciones, los comandos situados fuera del cuerpo de las funciones se ejecutan secuencialmente. Para que los comandos localizados en una función se ejecuten, tenemos que realizar una llamada a una función. Podemos llamar a la función tanto desde el programa principal como desde otra función.

Ejemplos:

Si no fuera por los comentarios, al estar dispuestos los comandos alrededor de la funcion f1, se haría difícil de leer este script.

Vemos el resultado:

Ejemplo más legible:

Resultado:

Veamos el mismo script con la segunda sintaxis:

Código de retorno de una función

Al igual que cualquier comando Unix/Linux, una función devuelve un código de error. Por defecto, el valor que devuelve corresponde al código del último comando ejecutado en la función. El comando return permite a esa función finalizar la ejecución de si misma y, si fuera necesario, devolver un código de error explícito.

El código de error devuelto por la función se guarda en la variable $?.

Ejemplo:

Este script que llamaremos existe_usuario nos solicita la entrada de un nombre de usuario y comprueba si éste existe o no en el sistema:

Si ejecutamos este listado veremos el resultado:

En función del valor devuelto por la función (0 ó 1), la estructura de control orientará el flujo de ejecución hacia la línea de comparación (verdadero o falso).

Ámbito de las variables

Las variables de usuario son globales. En el script existe_usuario. la variable usuario se inicializa en la función y se reutiliza en el programa principal. Cada referencia al nombre de la variable usuario hace referencia al mismo espacio de memoria.

Definición de variables locales

Con el comando typeset podemos definir variables locales en una función.

Sintaxis:

Ejemplo:

Veamos las definiciones de estas líneas:

Vemos el resultado:

Paso de parámetros

El shell ofrece un mecanismo que permite enviar valores a una función. Los valores recibidos por la función serán asignados automáticamente a las variables especiales de shell locales a la función.

Estas variables locales se llaman:

La variable $0 contiene siempre el nombre del script.

Ejemplo:

Este script llamado parametro contiene tres funciones. Cada función muestra sus parámetros recibidos:

Si lo ejecutamos deberíamos ver:

Desglosemos:

Función f1:

Se invoca a la función f1 con los valores 1 2 3:

Resultado:

Función f2:

Se invoca a la función f2 con los valores 10 1000 dias:

Resultado:

Función f3:

Se invoca a la función f3 con los argumentos recibidos desde el programa principal:

Resultado:

Utilizar la salida de una función

Una llamada a una función puede, al igual que sucede con los comandos, estar colocada dentro de los caracteres de sustitución de comandos (‘ ‘ o $()).

Ejemplo:

Este script, que llamaremos get_uid, recibe como argumento un nombre de usuario y busca su uid:

La línea get_uid $1, muestra que la función llamada get_uid imprime el uid del usuario del que ha recibido el nombre a través de un parámetro (si el usuario no existen este no recibe nada).

Esta línea a sido puesta para la demostración, en un caso real, no es muy útil.

La linea …

… llama de nuevo a la función. Mediante el mecanismo de sustitución de comandos, el shell reemplaza esta llamada por el valor mostrado por la función, asignandolo a la variable global $UID.

Programa completo de ejemplo

Este script que llamaremos getusuario que agrupará las funciones, ya vistas anteriormente, pausa, existe_usuario y get_uid.

Resultado:

  • Ensaya con los ejemplos, crea tus funciones, formatea el texto que aparecerá por pantalla, etc.
  • Crea tus menús de ejemplo.

A disfrutar…..