lunes, 15 de marzo de 2021

scripts en Bash... para torpes (VIII)

Voy rematando el tema… porque esto puede no acabar nunca. Es imposible meter toda ‘la ciencia’ necesaria para hacer scripts en unas pocas páginas. Porque los que saben tienen recursos (y conocimiento), pero los que no tenemos ni idea de eso que yo llamo, genéricamente, ‘saber de programación’ nos vemos obligados a hacer, como mucho, y con nuestras cuatro ideas mal aprendidas, de ‘cultura general’, cosas elementales.
Pero bueno, como decía (no se cuando) siempre nos queda el ‘copy & paste’ y, si ahora lo hacemos identificando algunas cosas de esos grandes scripts que encuentras por Google, y podemos, incluso, meter la manita en ellos para personalizar algo… sin (en cristiano…) ‘cagarla’… pues mejor que mejor.
Y hoy toca hablar de un recurso muy importante, una idea similar a la de las ‘variables’. Así que...
8- Las funciones (y alguna cosita más)


El concepto de ‘función’
El concepto de ‘función’ es otro gran invento en programación: si tengo varios comandos, o sentencias, largos y repetitivos, los puedo definir como una función, dándole un nombre, y luego me bastaría invocar esa función (o sea, una sola palabra) para se me ejecuten todos los comandos o sentencias que recoge.
Esto no solamente ahorra mucho trabajo, para no estar obligado a repetir una y otra vez un largo código, sino que así se ‘clarifica’ mucho el programa (o el script), al aligerarlo de texto. Las funciones pueden, incluso, ser complejas, incluir varias ordenes condicionales, etc. de manera que, siendo muy interesantes en programación, también lo podrían ser en ‘scripting’. Por eso, es absolutamente recomendable usarlas. Pero claro, esta recomendación tiene sentido… cuando haces programas largos. Que no suele ser lo habitual entre los ‘torpes’ pero en todo caso, es bueno conocer de qué va la cosa.
Como primera idea, se entenderá fácilmente que las funciones ‘se deben declarar’ antes de ser invocadas, por lo que es muy recomendable escribirlas al principio del script o del programa. Y así, si vemos un script complejo, posiblemente viendo sus primeras líneas podemos descubrir las funciones que usa.
La función se declara usando esta sintaxis:
nombre_función () {
comando o comandos a incluir (separándolos con punto y coma « ; », sin espacios)
}

Nota: también se puede declarar sin los paréntesis () escribiendo la primera linea así…
function nombre_función {   (etc)

(en este caso hay que fijarse en dejar un espacio en blanco entre el/los comando y las llaves de apertura y cierre. Y cuando hay varios comandos deben estar uno en cada linea o separados por el punto y coma { comando1;comando2 }

Una vez declaradas, las funciones actúan ‘cuando se las invoque expresamente’, dentro de un script, o programa. Y una función se invoca, simplemente, escribiendo el nombre que le hayamos asignado (de ahí que convenga vigilar que no haya coincidencias con términos comunes, y la liemos…. Por eso, hay quien recomienda nombrarlas como ‘func_XX’)

Y otra idea: una función también puede recibir (y tratar) los argumentos (parámetros de entorno) que hayamos incluido en la ejecución del script. Y con el mismo nombre, o sea, $1 primer argumento, $2 el segundo…. etc. La única diferencia es que, aquí, el parámetro $0 se refiere al nombre del script.

El potencial de las funciones es enorme, de ahí que un programador, buen conocedor del contexto, les puede sacar mucho partido. Los novatos tendremos que limitarnos al alcance de nuestro conocimiento de comandos, modificadores, idiomas… pero ahora, por aquello de verlo con algún ejemplo sencillo, vamos a meter en un script la función ‘dividir con 3 decimales’: Haríamos algo asi:
#!/bin/bash
func_DIV3 ()
{
read -p "introduce el dividendo: " num1
read -p "introduce el divisor: " num2
COCI=$(echo "scale=3; $num1 / $num2" | bc) && echo "el resultado, con 3 decimales, es: $COCI"
}
func_DIV3

donde, como se ve, una vez declarada la función, para obtener el resultado, solo he necesitado escribir ‘func_DIV3’

Y esto nos lleva, al final (sobre todo si vas a dedicarte en plan ‘Pro’ a esto de los scripts) a hablar de la ‘Biblioteca de Funciones’.
Esta ‘biblioteca’ no es más que un archivo de texto donde vas guardando aquellas ‘declaraciones de funciones’ que veas interesantes, para reutilizarlas cuando te convenga. Porque se da esta estupenda circunstancia: que este archivo de texto lo puedes ‘utilizar desde otro script’. Asi que puedes crear un archivo-librería (llámalo, por ejemplo, ‘mis_func’) y ‘apuntar’ a esa librería cuando necesites alguna función de las que tienes ahí. Para eso se utiliza el comando source (o su ‘alias’, el punto).
Entonces si tienes un archivo de texto que se llame, por ejemplo ‘mis_func’, puedes integrarlo al principio de cualquier script con…

#!/bin/bash
. ./mis_func
(o con source ./mis_func)

(y aquí seguiría el desarrollo del script. Y, en él, se podría invocar a las funciones que tengas en tu ‘Biblioteca de Funciones’ que has llamado y archivado en ‘mis_func’)

Así que, en el ejemplo que he puesto antes, de tener ese ‘mis_func’ (en la ruta raiz de tu /home, donde se abre la consola por defecto) para escribir ese script bastaría poner…
#!/bin/bash
source ./mis_func
func_DIV3

(donde se ve la importancia de las funciones para ahorrar líneas de programación… sobre todo cuando seas un ‘Pro’ que tenga que hacer muchos (y largos) scripts)

El concepto de ‘array’
Este es otro concepto que los programadores, al parecer, conocen bien. Un array es una matriz o, si así se puede entender mejor, una lista de elementos ‘de la misma familia’. Es decir, que se tratan homogéneamente (por ejemplo, una lista de direcciones de email, una lista de archivos, una lista de libros…). El uso de arrays (matrices de datos) en programación, como pasaba con las variables y las funciones, puede facilitar mucho el trabajo.

Como siempre, antes de usarlo (invocarlo) un array tiene que estar ‘declarado’. Para declarar un array hay que poner su nombre, y los datos que debe contener, con dos condiciones básicas: que los datos deben añadirse separados por un espacio en blanco… y que si el dato tiene espacio, debe escribirse ‘entre comillas’. Pero hay, al menos, 3 manerar de declararlo. Estas…
nombreArray[0]= dato1 dato2 dato3
declare -a nombreArray=(dato1 dato2 dato3)
nombreArray=(dato1 dato2 dato3)

Y, a partir de aquí… yo, como buen ‘torpe’, me planto. Ya me parece que es ‘meterse en camisa de once varas’ para quien no ha estudiado algo de Programación. Vamos, que entiendo las arrays… pero no alcanzo a entender en qué se les puede sacar partido. Y lo malo es que, mirando por Google, tampoco encuentro nada que me lo aclare. A lo mejor, algún día alguien me explica una tontería de la que no me había percatado… y se me hace la luz.
Así que, entretanto, y como yo nunca voy a usar arrays, redirijo al estudioso o bien a Google (donde hay mucha información, otra cosa es entenderla) o al Blog de un estupendo bloguero:
https://www.atareao.es/tutorial/scripts-en-bash/arrays-en-bash/

 

Ir al Sumario (del tema)

No hay comentarios:

Publicar un comentario