Más profundamente en complejidades de funciones con scripting de shell - Parte VII

Más profundamente en complejidades de funciones con scripting de shell - Parte VII

Mi artículo anterior sobre "Comprender y escribir funciones en scripts de shell" podría haberle dado una idea básica sobre cómo escribir funciones en scripts de shell. Ahora es el momento de profundizar en las características funcionales como el uso de variables y recursión locales.

Complejidades de funciones con scripting de shell

Variables locales

Lo que hace una variable local? Depende de ese bloque en particular donde se declare la variable. Una variable declarada como local será accesible desde ese bloque de código donde aparece.mi. Su alcance es local. Para explicar esto, veamos un ejemplo a continuación.

#!/bin/bash func () local i = 10 j = 20 echo "i de func = $ i" echo "j de func = $ j" echo "i externo func = $ i" echo "j externo func = $ j "func echo" iution func = $ i "echo" j exterior func = $ j "salida 0

Al ejecutar el script anterior, la salida será.

I Outside func = j exterior func = i desde func = 10 j from func = 20 i exterior func = j exterior func = 20

Esto se debe a que la función concurrido aún no ha llamado mientras el Primero 2 Las declaraciones de eco fueron ejecutadas. Después de llamar a la función concurrido lo mismo 2 declaraciones de eco producir un resultado diferente. Ahora la variable j, que fue declarado dentro concurrido y no local, se puede acceder después.

Así valor para j se convierte en 20. ¿Qué pasa con la variable local? i? Dado que su alcance estaba dentro de la función concurrido, valor 10 No se pudo acceder desde afuera. Tenga en cuenta que la variable j normalmente declarado dentro concurrido es global de forma predeterminada.

Ahora está familiarizado con las variables locales y cómo usarlas dentro de los bloques de funciones. Pasemos a la sección más interesante en las funciones, la recursión.

Que es la recursión?

Una función que se llama a sí misma generalmente se denomina el procedimiento de recursión. O se puede definir como expresar un algoritmo utilizando una versión más simple de ese mismo algoritmo. Considere el ejemplo de encontrar factor de un número. Lo sabemos norte! = 1 x 2 x 3 x ... x (n-1) x n. Por lo tanto, podemos escribir una relación de recurrencia como:

norte! = (N-1)! x n

Por lo tanto, es fácil para nosotros llamar recursivamente la misma función y usar el valor de retorno de cada llamada para multiplicar con el resultado anterior, i.mi.

5! = 4! x 5 4! = 3! x 4 3! = 2! x 3 2! = 1! x 2 1! = 0! x 1

Recursión utilizando variables locales

Aquí tratamos de escribir un script para encontrar factor de un número usando variables locales y recursión.

#!/bin/bash fact () local num = $ 1 if [$ num -eq 0]; luego ret = 1 else temp = $ ((num-1)) hecho $ tempe ret = $ ((num*$?)) Fi Return $ Ret Fact 5 Echo "Factorial de 5 = $?"Salir 0

numer es una variable local utilizada para almacenar cada N-1 valor en cada llamada. Aquí la condición base verifica si el número es igual a cero o no (desde 0! = 1 y factorial no está definido para números negativos). Al llegar esta condición base, devuelve el valor 1 a su persona que llama. Ahora num = 1 y Ret = 1 x 1.

En este instante regresa 1 a su persona que llama. Ahora num = 2 y Ret = 2 x 1 etcétera. Finalmente cuando num = 5 El valor de devolución será 24 y el resultado final es Ret = 5 x 24. El resultado final 120 se transmite a la instrucción inicial de llamadas y se muestra.

Hay un problema en el script anterior. Como expliqué en el artículo anterior, las funciones no pueden devolver enteros grandes. Por lo tanto, le queda a los usuarios encontrar una solución para el problema anterior.

Q. ¿Podemos realizar una recursión sin usar variables locales?? La respuesta es.

Recursión sin variables locales

Mire el siguiente ejemplo para mostrar el Serie Fibonacci Usando recursión. La relación de recurrencia básica es:

fib (0) = 0 fib (1) = 1 else fib (n) = fib (n-1) + fib (n-2) Serie Fibonacci usando la recursión #!/bin/bash fib () a = $ 1 if [$ a -lt 2]; Entonces echo $ a else (((--a)) b = $ (fib $ a) ((--a)) c = $ (fib $ a) echo $ ((b+c)) fi para i en $ (SEQ 0 15) HACER OUT = $ (FIB $ I) ECHO $ ​​OUT DECHO SALICIÓN 0

No se utilizan variables locales en el script anterior. Espero que puedas entender el flujo de script durante la ejecución.

Aquí el valor 15 representa el número de términos en el Serie Fibonacci para ser mostrado. ¿Notó algo especial con respecto a la ejecución del script anterior?. Lleva un tiempo, ¿no es así?? La recursión en un script es más lenta que una recursión en lenguajes de programación como C.

Con este artículo, planeo concluir la parte de las funciones en los scripting de shell. Mantente actualizado con Tecmenta tener los próximos artículos en matrices y mucho más…