FUNCIONES

Podemos definir las funciones en el shell, y si escribe scripts shell de cualquier tamaño, querrá usarlas para estructurar el código.

funciones_nota1

Para definir una función shell, sólo tiene que escribir su nombre seguido de un paréntesis vacío e introducir la sentencia entre corchetes:

funciones_ejemplo

Una función sencilla

Empezaremos con un a función realmente sencilla:

ejemplo_funcion_script

Al ejecutar el script obtendremos:

funcion_ejemplo

Cómo funciona

Este script empieza a ejecutar desde la parte superior. Todo igual que siempre. La diferencia es que cuando encuentra la construcción foo() {, el script sabe que se está definiendo una función denominada foo.

función_linea1

Se queda con la idea de que foo se refiere a una función y se sigue ejecutando hasta que encuentra el corchete de cierre correspondiente }. Cuando se ejecuta únicamente la línea foo, la shell sabe que tiene que ejecutar la función definida anteriormente. Cuando se completa la función, la ejecución se reanuda en la línea posterior a la llamada a foo.

funcion_linea2

Debe definir siempre una función antes de invocarla, es parecida a la definición de una función Pascal antes de la invocación pero no hay declaraciones posteriores en la shell. Esto no supone un problema, porque todos los scripts comienzan a ejecutarse desde la parte superior, de manera que si anteponemos todas las funciones a la primera llamada de la función, conseguiremos de que todas las funciones se definan antes de que puedan ser invocadas.

Cuando se solicita una función, los parámetros posicionales del script, $*, $@, $#, $1, $2, etc., son reemplazados por los parámetros de la función. Así es como leemos nosotros los parámetros transmitidos a la función. Cuando la función acaba, se restablecen los valores anteriores.

funcion_nota2

Mediante el comando return puede hacer que las funciones envíen valores numéricos. Normalmente, para que las funciones retornen cadenas, la función debe almacenar la cadena en una variable, que podrá ser usada posteriormente, cuando finalice la función. También puede usar echo con una cadena y tomar el resultado de esta manera:

funcion_ejemplo3

Tenga en cuenta que puede declarar variables locales dentro de las funciones shell usando la palabra clave local. Después, la variable estará al alcance sólo dentro de la función. Sino, la función podrá acceder a las otras variables shell a las que se puede acceder globalmente. Si una variable local tiene le mismo nombre que una variable global, recu8brirá a dicha variable, pero únicamente dentro de la función. Por ejemplo, puede realizar los siguientes cambios en el script anterior para ver la puesta en práctica.

ejemplo_script_funcion

La salida sería:

ejemplo_script_terminal

A falta de un comando return que especifique un valor de retorno, una función envía el estado de salida del último comando ejecutado.

Envío de un valor

El siguiente script, mi_nombre, muestra cómo se transmiten los parámetros de una función y cómo pueden enviar las funciones un resultado true o false. Use un parámetro del nombre que desea usar en la pregunta para llamar a este script.

  1. Tras la cabecera de la shell, defina la función si_o_no.funcion_paso1
  2. La parte principal del programa empieza así:funcion_ejemplo_2

La salida normal  de este script sería:

script_funcion3Cómo funciona

Cuando se ejecuta el script, se define la función si_o_no pero no se ejecuta. En la sentencia if, el script ejecuta la función si_o_no, transmitiendo el resto de la línea a modo de parámetros a la función tras sustituir el $1 por el primer parámetro del script original, Atika. La función usa estos parámetros, que se encuentran en los parámetros posicionales $1, $2, etc., y enviá un valor al solicitante. Dependiendo del valor enviado, la construcción if ejecuta la sentencia adecuada.

Como ha visto, la shell dispone de un amplio conjunto de estructuras de control y de sentencias condicionales. Tendrá que aprender algunos de los comandos de la shell, y después ya estará listo para hacer frente a un problema de programación real sin un compilador a la vista.

atras

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.