GNU/Linux >> Tutoriales Linux >  >> Linux

Bash Scripting Part6 - Crear y usar funciones de Bash

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.


Linux
  1. Cómo definir y usar funciones en Linux Shell Script

  2. Cree una nueva base de datos y utilícela en MySQL/MariaDB

  3. ¿Funciones en variables de Shell?

  4. Bash Beginner Series #9:Uso de funciones en Bash

  5. Cómo crear y llamar funciones en Bash

Funciones bash

Shell Scripting Parte V:Funciones en Bash

Bash Scripting - Funciones explicadas con ejemplos

Cómo usar el comando de fecha en Bash Scripting en Linux

Crear y usar alias de Bash en Linux

Cómo crear y usar un archivo de intercambio en Linux