[Bash] Funciones

[h]¿Que es una función? ¿Como redactarla? ¿Como ejecutarla? ¿A que sirve?[/h]

https://www.wifi-libre.com/img/members/3/p_anonymous-function.png

La “función” en bash (y en lenguajes de programación) es algo muy importante.
El uso de funciones es inevitable si nuestro script es algo largo así que no hay otra que entender como las funciones … “funcionan” :stuck_out_tongue:
Es muy fácil y permite hacer cosas muy complejas.

[h]¿Que es una función?[/h]

Una definición básica sería : “Una función es una secuencia de código.
Es decir varias lineas de código que juntamos en un bloque.
Esta secuencia se ve atribuir un nombre.
podremos así ejecutar la función invocando su nombre.
De cierto modo un función nos permite crear nuestros propios “comandos” personalizados.

Nada mejor para entender algo que hacerlo así que vamos a redactar y emplear una función

[h]¿Como redactar una función ?[/h]

Una función se compone de tres elementos :
[list=1]
]Un nombre/]
]Una instrucción de abertura y una instrucción de cierre/]
]Una secuencia de ordenes/]
[/list]

Lo primero que debemos hacer es darle un nombre.
Llamaremos la nuestra “FUNC”
Para que bash entienda que estamos definiendo una función debemos añadir después el nombre dos paréntesis; de este modo ()
Así que si quiero empezar a definir una función que se lama FUNC debo escribir

FUNC()

Luego tengo que poner la instrucción de abertura. marca el inicio de la secuencia de ordenes que queremos poner en nuestra función.
Se hace con el dígito {

FUNC() {

Ahora toca poner la secuencia de ordenes que queremos ejecutar.
Por ejemplo nuestra función “FUNC” va a decir “estas son las interfaces detectadas por aircrack-ng” (comando “echo”) y ejecutar airmon-ng.

FUNC() { echo " ***** Esta son las interfaces detectadas por aircrack-ng ***** " sudo airmon-ng

Y por fin cerramos la secuencia de ordenes y acabamos de declarar nuestra función con el símbolo } (la instrucción de cierre)
Aquí va nuestra función completa** FUNC**

FUNC() { echo " ***** Esta son las interfaces detectadas por aircrack-ng ***** " sudo airmon-ng }

https://www.wifi-libre.com/img/members/3/func2.jpg

[h]¿Como usar una función?[/h]

Algo que puede parecer obvió pero que puede ser bueno recordar es que hay que definir una función antes de invocarla.
Porque si no la defino obtendré en consola un mensaje de error “orden desconocida”
https://www.wifi-libre.com/img/members/3/func3.jpg

Entonces, una vez que hemos definido nuestra función - con su nombre, las dos paréntesis , la instrucción de abertura, el código a ejecutar y la instrucción de cierre - solo tengo que invocarla para ejecutarla.
Escribo su nombre (FUNC) y se ejecuta
https://www.wifi-libre.com/img/members/3/func4.jpg

[h]¿A que sirve?[/h]

La primera “función” de la función es ahorrarnos código. Muchas veces cuando hacemos códigos largos hay secuencias que repetimos.
Declaramos una función con la secuencia repetida una sola vez en inicio de código y luego solo tendremos que entrar su nombre para ejecutarla.
Pero esto no es todo.
Una cosa bastante chula de la función es que la podemos **usarla de forma recursiva para hacer un bucle **
Me explico con un ejemplo. Imaginamos que queremos hacer un script que nos devuelve el valor decimal de una cadena hexadecimal.
Podríamos hacer algo así, en dos liñas :

read -ep "Entrar la cadena hexadecimal a convertir " HEX

con **read **pedimos al usuario que entre el valor a convertir que guardamos en la variable “HEX
Luego convertimos el valor de HEX a decimal y sale en consola:

printf "%d\n" 0x$HEX

Tenemos a nuestro script.
Pregunta a mil € : ¿Como hacer un bucle?
Ahora si ejecuto mi script; puedo convertir una sola cadena y se parra.
https://www.wifi-libre.com/img/members/3/func5.jpg
Lo que quiero es un bucle, para poder volver a convertir datos en lugar que se parre

Para hacer un bucle voy a llamar la función … a dentro de la función.
Declaro mi script de dos liñas como una función que llamo FUNC

FUNC() { read -ep "Entrar la cadena hexadecimal a convertir " HEX printf "%d\n" 0x$HEX }
Y justo antes de cerrar la funcción llamo à la funcción.FUNC para volver a ejecutarla.
Así se ejecuta la función y justo antes de acabarse… vuelve a ejecutarse… nunca se parra el proceso y podemos convertir datos hasta el final de los tiempos.

FUNC() { read -ep "Entrar la cadena hexadecimal a convertir " HEX printf "%d\n" 0x$HEX FUNC }
https://www.wifi-libre.com/img/members/3/func6.jpg

Este ultimo punto es a lo mejor un poco difícil de pillar… Pensar en lo que hace el código paso a paso, liña por liña.
Se van ejecutando las ordenes de la secuencia liña por liña
Y la ultima orden (que es “FUNC”, es decir llamar la función) significa “volver a ejecutar la secuencia”
Entramos así en un bucle infinito,

Hasta la próxima… :wink: