GNU/Linux >> Tutoriales Linux >  >> Linux

Bash Beginner Series #9:Uso de funciones en Bash

Cuando sus scripts de bash se hacen más y más grandes, ¡las cosas pueden complicarse mucho!

Puede encontrarse reescribiendo las mismas piezas de código una y otra vez en diferentes partes de sus scripts de bash.

Afortunadamente, puede evitar tener que volver a escribir el código usando funciones en bash que harán que sus scripts estén más organizados y legibles.

En este tutorial, aprenderá a crear funciones, devolver valores de funciones y pasar argumentos de funciones en scripts de bash shell.

Además, aprenderá cómo funciona el alcance de las variables y cómo definir funciones recursivas.

Creando funciones en bash

Hay dos sintaxis diferentes para declarar funciones bash. La siguiente sintaxis es la forma más común de crear funciones bash:

function_name () {
commands
}

El segundo uso menos común de la creación de funciones bash comienza con la función de trabajo reservada seguida del nombre de la función de la siguiente manera:

function function_name {
commands
}

Ahora bien, hay un par de cosas que debe tener en cuenta al trabajar con funciones:

  • Una función nunca se ejecutará/ejecutará a menos que invoque/llame a la función.
  • La definición de la función debe preceder a cualquier llamada a la función.

Cada vez que desee que se ejecute una función, ¡solo tiene que llamarla! Una llamada de función se realiza simplemente haciendo referencia al nombre de la función.

Eche un vistazo al siguiente fun.sh secuencia de comandos bash:

#!/bin/bash

hello () {
echo "Hello World"
}

hello
hello
hello

Definí una función llamada hola que simplemente hace eco de la línea “Hello World” a la terminal Fíjate que hice tres hola llama a la función y, por lo tanto, si ejecuta el script, verá el mensaje “Hello World” línea impresa tres veces en la pantalla:

[email protected]:~$ ./fun.sh
Hello World
Hello World
Hello World

Devolver valores de función en bash

En muchos lenguajes de programación, las funciones devuelven un valor cuando se las llama; sin embargo, este no es el caso con bash ya que las funciones de bash no devuelven valores.

Cuando una función bash termina de ejecutarse, devuelve el estado de salida del último comando ejecutado capturado en el $? variable. Cero indica una ejecución exitosa o un número entero positivo distinto de cero (1-255) para indicar una falla.

Puede utilizar un retorno declaración para alterar el estado de salida de la función. Por ejemplo, eche un vistazo al siguiente error.sh guión:

#! /bin/bash

error () {
blabla
return 0
}

error
echo "The return status of the error function is: $?"

Si ejecuta el error.sh script bash, es posible que se sorprenda del resultado:

[email protected]:~$ ./error.sh
./error.sh: line 4: blabla: command not found
The return status of the error function is: 0

Sin el retorno 0 declaración, el error la función nunca habría devuelto un estado de salida distinto de cero como blabla da como resultado un comando no encontrado error.

Entonces, como puede ver, aunque las funciones bash no devuelven valores, hice una solución alterando los estados de salida de la función.

También debe tener en cuenta que una declaración de devolución finaliza inmediatamente una función.

Pasar argumentos a la función bash

Puede pasar argumentos a una función de la misma manera que puede pasar argumentos a un script bash. Simplemente incluye los argumentos cuando haces la llamada a la función.

Para demostrarlo, echemos un vistazo al siguiente iseven.sh secuencia de comandos bash:

#!/bin/bash

iseven () {
if [ $(($1 % 2)) -eq 0 ]; then
echo "$1 is even."
else
echo "$1 is odd."
fi
}

iseven 3
iseven 4
iseven 20
iseven 111

El iseven() La función comprueba si un número es par o impar. Hice cuatro llamadas de función a iseven() . Para cada llamada de función, proporcioné un número que es el primer aumento de la función iseven() y está referenciado por $1 variable en la definición de la función.

Ejecutemos iseven.sh script bash para asegurarse de que funciona:

[email protected]:~$ ./iseven.sh
3 is odd.
4 is even.
20 is even.
111 is odd.

También debe tener en cuenta que los argumentos de la función bash y los argumentos del script bash son dos cosas diferentes. Para contrastar la diferencia, eche un vistazo al siguiente funarg.sh secuencia de comandos bash:

#!/bin/bash

fun () {
echo "$1 is the first argument to fun()"
echo "$2 is the second argument to fun()"
}

echo "$1 is the first argument to the script."
echo "$2 is the second argument to the script."

fun Yes 7

Ejecute el script con un par de argumentos y observe el resultado:

[email protected]:~$ ./funarg.sh Cool Stuff
Cool is the first argument to the script.
Stuff is the second argument to the script.
Yes is the first argument to fun()7 is the second argument to fun()

Como puede ver, aunque usó las mismas variables $1 y $2 para hacer referencia tanto a los argumentos del script como a los argumentos de la función, producen resultados diferentes cuando se les llama desde dentro de una función.

Variables locales y globales en funciones bash

Las variables de Bash pueden tener un alcance global o local. Puede acceder a una variable global en cualquier lugar de un script bash, independientemente del alcance. Por el contrario, solo se puede acceder a una variable local desde dentro de su definición de función.

Para demostrarlo, eche un vistazo al siguiente scope.sh secuencia de comandos bash:

#!/bin/bash

v1='A'
v2='B'

myfun() {
local v1='C'
v2='D'
echo "Inside myfun(): v1: $v1, v2: $v2"
}

echo "Before calling myfun(): v1: $v1, v2: $v2"
myfun
echo "After calling myfun(): v1: $v1, v2: $v2"

Primero definí dos variables globales v1 y v2 . Luego dentro de myfun() definición, utilicé la local palabra clave para definir una variable local v1 y modificó la variable global v2. Tenga en cuenta que puede usar el mismo nombre de variable para variables locales en diferentes funciones.

Ahora ejecutemos el script:

[email protected]:~$ ./scope.sh
Before calling myfun(): v1: A, v2: B
Inside myfun(): v1: C, v2: D
After calling myfun(): v1: A, v2: D

A partir de la salida del script, puede concluir lo siguiente:

  • Una variable local que tenga el mismo nombre que una variable global tendrá prioridad sobre las variables globales dentro del cuerpo de una función.
  • Puede cambiar una variable global desde dentro de una función.

Funciones recursivas

¡Una función recursiva es una función que se llama a sí misma! Las funciones recursivas son útiles cuando intenta resolver un problema de programación que se puede dividir en subproblemas más pequeños.

La función factorial es un ejemplo clásico de función recursiva. Echa un vistazo al siguiente factorial.sh secuencia de comandos bash:

#!/bin/bash

factorial () {
if [ $1 -le 1 ]; then
echo 1
else
last=$(factorial $(( $1 -1)))
echo $(( $1 * last ))
fi
}

echo -n "4! is: "
factorial 4
echo -n "5! is: "
factorial 5
echo -n "6! is: "
factorial 6

Cualquier función recursiva debe comenzar con un caso base lo cual es necesariamente para terminar la cadena de llamadas a funciones recursivas. En el factorial() función, el caso base se define de la siguiente manera:

if [ $1 -le 1 ]; then
echo 1

Ahora deriva el caso recursivo para la función factorial. Para calcular el factorial de un número n donde n es un número positivo mayor que uno, puedes multiplicar n por el factorial de n-1 :

factorial(n) = n * factorial(n-1)

Usemos la ecuación anterior para escribir este caso recursivo:

last=$(factorial $(( $1 -1)))
echo $(( $1 * last ))

Ahora ejecute el script y asegúrese de obtener los resultados correctos:

[email protected]:~$ ./factorial.sh
4! is: 24
5! is: 120
6! is: 720

Como ejercicio adicional, intente escribir una función recursiva para calcular el n-ésimo número de Fibonacci. Primero, trata de pensar en el caso base y luego en el caso recursivo; ¡Tienes esto!

¿Necesitas más ejercicio? Descargue el PDF a continuación y practique funciones en scripts de bash. También tienes las soluciones en el mismo PDF.

Bash Capítulo 9 Preguntas de práctica Problemas y su solución para practicar lo que acabas de aprender en este capítulo Bash-Chapter-9-Practice-Questions-Linux-Handbook.pdf31 KB

¡Impresionante! El próximo y último capítulo de esta serie aplicará todo lo que ha aprendido hasta ahora para escribir scripts bash efectivos que automaticen tareas administrativas aburridas.


Linux
  1. Usando Bash para la automatización

  2. ¿Funciones en variables de Shell?

  3. Bash Beginner Series #8:Bucles en Bash

  4. Uso de declaraciones de casos en Bash

  5. Cómo crear y llamar funciones en Bash

Bash Beginner Series #3:Pasando Argumentos a Bash Scripts

Bash Beginner Series #7:Toma de decisiones con sentencias If Else y Case

Bash Beginner Series #6:Operaciones de cadenas en Bash

Bash Beginner Series #10:Automatización con Bash

Bash Scripting Part6 - Crear y usar funciones de Bash

Tutorial de funciones de Bash Shell con 6 ejemplos prácticos