Antes de hablar sobre las funciones de bash, analicemos esta situación. Al escribir scripts bash, se dará cuenta de que está utilizando el mismo código en varios lugares.
Si se cansa de escribir las mismas líneas de código una y otra vez en su secuencia de comandos bash, sería bueno escribir el bloque de código una vez y llamarlo en cualquier parte de su secuencia de comandos bash.
El shell bash le permite hacer exactamente eso con Funciones .
Funciones bash son bloques de código que puede reutilizar en cualquier parte de su código. Cada vez que desee utilizar este bloque de código en su secuencia de comandos, simplemente escriba el nombre de la función que se le ha asignado.
Vamos a hablar sobre cómo crear sus funciones bash y cómo usarlas en scripts de shell.
Crear una función
Puede definir una función como esta:
functionName() { }
Los corchetes () son necesarios para definir la función.
Además, puede definir la función usando la palabra clave function, pero esta palabra clave está obsoleta para la portabilidad POSIX.
function functionName() { # Deprecated definition but still used and working }
En la segunda definición, los corchetes no son obligatorios.
Uso de funciones
#!/bin/bash myfunc() { echo "Using functions" } total=1 while [ $total -le 3 ]; do myfunc total=$(($total + 1)) done echo "Loop finished" myfunc echo "End of the script"
Aquí hemos creado una función llamada myfunc, y para llamarla, simplemente escribimos su nombre.
Puede llamar a la función tantas veces como desee.
Aviso:si intenta usar una función que no está definida, ¿qué sucederá?
#!/bin/bash total=1 while [ $total -le 3 ]; do myfunc total=$(($total + 1)) done echo "Loop End" myfunc() { echo "Using function ..." } echo "End of the script"
Oh, es un error porque no existe tal función.
Otro aviso:el nombre de la función bash debe ser único. De lo contrario, la nueva función cancelará la función anterior sin ningún error.
#!/bin/bash myfunc() { echo "The first function definition" } myfunc function myfunc() { echo "The second function definition" } myfunc echo "End of the script"
Como puede ver, la definición de la segunda función toma el control de la primera sin ningún error, así que tenga cuidado al definir funciones.
Usando el comando de retorno
El comando de retorno devuelve un número entero de la función.
Hay dos formas de usar el comando de retorno; la primera forma es así:
#!/bin/bash myfunc() { read -p "Enter a value: " value echo "adding value" return $(($value + 10)) } myfunc echo "The new value is $?"
La función myfunc suma 10 a la variable $value y luego muestra la suma usando el $? variables.
No ejecute ningún comando antes de obtener el valor de la función, porque la variable $? devuelve el estado de la última línea.
Este método de devolución devuelve números enteros. ¿Qué pasa con la devolución de cadenas?
Uso de la función de salida
La segunda forma de devolver un valor de una función bash es la sustitución de comandos. De esta manera, puede devolver cualquier cosa desde la función.
#!/bin/bash myfunc() { read -p "Enter a value: " value echo $(($value + 10)) } result=$(myfunc) echo "The value is $result"
Pasar parámetros
Podemos manejar funciones bash como pequeños fragmentos que podemos reutilizar, y eso está bien, pero necesitamos hacer que la función sea como un motor, le damos algo y devuelve un resultado basado en lo que proporcionamos.
Puede utilizar las variables de entorno para procesar los parámetros pasados a la función. El nombre de la función se declara como variable $0 y los parámetros pasados son $1, $2, $3, etc.
Puede obtener el número de parámetros pasados a la función utilizando ($# ) variable.
Pasamos parámetros como este:
myfunc $val1 10 20
El siguiente ejemplo muestra cómo usar la variable ($#):
#!/bin/bash addnum() { if [ $# -gt 2 ]; then echo "Incorrect parameters passed" # If parameters no equal 2 else echo $(($1 + $2)) # Otherwise add them fi } echo -n "Adding 10 and 15: " value=$(addnum 10 15) echo $value echo -n "Adding three numbers: " value=$(addnum 10 15 20) echo $value
La función addnum obtiene el recuento de los parámetros pasados. Si pasa más de 2, devuelve -1.
Si hay un parámetro, la función addnum agrega este parámetro dos veces. Si se pasan dos parámetros, la función addnum los agrega, y si intenta agregar tres parámetros, devolverá -1.
Si intenta utilizar los parámetros pasados dentro de la función, falla:
#!/bin/bash myfunc() { echo $(($1 + $2 + $3 + $4)) } if [ $# -eq 4 ]; then value=$(myfunc) echo "Total= $value" else echo "Passed parameters like this: myfunc a b c d" fi
En su lugar, debe enviarlos a la función de esta manera:
#!/bin/bash myfunc() { echo $(($1 + $2 + $3 + $4)) } if [ $# -eq 4 ]; then value=$(myfunc $1 $2 $3 $4) echo "Total= $value" else echo "Passed parameters like this: myfunc a b c d" fi
¡¡Ahora funciona!!
Variables de procesamiento en funciones Bash
Cada variable que usamos tiene un alcance; el alcance es la visibilidad variable de su secuencia de comandos.
Puede definir dos tipos de variables:
- Global
- Locales
Variables globales
Son visibles y válidos en cualquier parte del script bash. Incluso puede obtener su valor desde dentro de la función.
Si declara una variable global dentro de una función, puede obtener su valor desde fuera de la función.
Cualquier variable que declare es una variable global por defecto. Si defines una variable fuera de la función, la llamas dentro de la función sin problemas:
#!/bin/bash myfunc() { input=$(($input + 10)) } read -p "Enter a number: " input myfunc echo "The new value is: $input"
Si cambia el valor de la variable dentro de la función, el valor se cambiará fuera de la función.
Entonces, ¿cómo superar algo así? Usa variables locales.
Variables locales
Si usa la variable solo dentro de la función, puede declararla como una variable local usando la palabra clave local como esta:
local tmp=$(( $val + 10 ))
Entonces, si tiene dos variables, una dentro de la función y la otra fuera de la función, y tienen un nombre idéntico, no se afectarán entre sí.
#!/bin/bash myfunc() { local tmp=$(($val + 10)) echo "The Temp from inside function is $tmp" } tmp=4 myfunc echo "The temp from outside is $tmp"
Cuando usa la variable $tmp dentro de la función myfunc, no cambia el valor de $tmp, que está fuera de la función.
Pasar matrices como parámetros
¿Qué sucederá si pasa una matriz como parámetro a una función:
#!/bin/bash myfunc() { echo "The parameters are: [email protected]" arr=$1 echo "The received array is ${arr[*]}" } my_arr=(5 10 15) echo "The old array is: ${my_arr[*]}" myfunc ${my_arr[*]}
La función solo toma el primer valor de la variable de matriz.
Debe desensamblar la matriz en sus valores individuales y luego usar estos valores como parámetros de función. Finalmente, empaquételos en una matriz en la función como esta:
#!/bin/bash myfunc() { local new_arr new_arr=("[email protected]") echo "Updated value is: ${new_arr[*]}" } my_arr=(4 5 6) echo "Old array is ${my_arr[*]}" myfunc ${my_arr[*]}
La variable de matriz fue reconstruida gracias a la función.
Función recursiva
Esta función permite que la función se llame a sí misma desde dentro de la propia función.
El ejemplo clásico de una función recursiva es el cálculo de factoriales. Para calcular el factorial de 3, usa la siguiente ecuación:
3! =1 * 2 * 3
En su lugar, podemos usar la función recursiva de esta manera:
x! = x * (x-1)!
Entonces, para escribir la función factorial usando secuencias de comandos de bash, será así:
#!/bin/bash fac_func() { if [ $1 -eq 1 ]; then echo 1 else local tmp=$(($1 - 1)) local res=$(fac_func $tmp) echo $(($res * $1)) fi } read -p "Enter value: " val res=$(fac_func $val) echo "The factorial of $val is: $res"
¡Usar funciones bash recursivas es muy fácil!
Crear bibliotecas
Ahora sabemos cómo escribir funciones y cómo llamarlas, pero ¿qué sucede si desea usar estas funciones bash o bloques de código en diferentes archivos de script bash? sin copiarlo y pegarlo en sus archivos.
Puede crear una biblioteca para sus funciones y apuntar a esa biblioteca desde cualquier archivo que necesite.
Usando el comando fuente , puede incrustar la secuencia de comandos del archivo de biblioteca dentro de su secuencia de comandos de shell.
El comando fuente tiene un alias, que es el punto. Para generar un archivo en un script de shell, escriba la siguiente línea:
. ./myscript
Supongamos que tenemos un archivo llamado myfuncs que contiene lo siguiente:
addnum() { echo $(($1 + $2 + $3 + $4)) }
Ahora, lo usaremos en otro archivo de script bash como este:
#!/bin/bash . ./myfuncs result=$(addnum 10 10 5 5) echo "Total = $result"
¡¡Impresionante!! Hemos usado las funciones bash dentro de nuestro archivo de script bash; también podemos usarlos en nuestro shell directamente.
Usar las funciones de Bash desde la línea de comandos
Bueno, eso es fácil, si leyó la publicación anterior, que trataba sobre las señales y los trabajos, tendrá una idea sobre cómo obtener nuestro archivo de funciones en el archivo bashrc y, por lo tanto, podemos usar las funciones directamente desde el shell bash. . Genial
Edite el archivo bashrc en /home/username y agregue esta línea:
. /home/likegeeks/Desktop/myfuncs
Asegúrese de escribir la ruta correcta.
Ahora la función está disponible para que la usemos directamente en la línea de comandos:
$ addnum 10 20
Nota:es posible que deba cerrar sesión e iniciar sesión para usar las funciones de bash desde el shell.
Otra nota:si hace que el nombre de su función sea como cualquiera de los comandos integrados, sobrescribirá el comando predeterminado, por lo que debe encargarse de eso.
Espero que les guste la publicación. Sigue regresando.
Gracias.