Tutoriales

Funciones de scripting Bash explicadas con ejemplos

En las secuencias de comandos de bash shell, las funciones son formas de agrupar el conjunto de declaraciones para lograr un resultado específico. Puede pensar en las funciones como miníndices. En algunos lenguajes de programación, las funciones también se denominan procedimientos y métodos. Las características son una excelente manera de lograr modularidad y reutilización.

En este artículo usaré ejemplos para explicar cómo usar funciones en scripts bash en Linux. Al final de este artículo, estará bastante familiarizado con el uso de las funciones bash.

Cómo definir funciones en Bash

Hay dos cosas importantes a tener en cuenta al trabajar con funciones.

  • Definiendo la función,
  • Llamando a la función.

De manera similar a cómo crea y ejecuta scripts de bash, debe definir y llamar a la función para que se ejecute.

Hay dos formas sintácticas de definir una función en bash. La primera opción es usar la palabra clave bash incorporada "function" seguido del nombre de la función. El bloque de código está escrito en él. Tirantes rizados .

function [name] 
Block of code

La segunda opción es crear una función sin la palabra clave "function". Comience con el nombre de la función seguido de paréntesis.

[name]()
Block of Code

Cuál elegir Bueno, siempre es una elección personal. No hay desventajas en elegir uno sobre el otro.

También puede escribir funciones de una sola línea que se llamarán funciones compactas. En las funciones compactas, cada línea de código dentro de las llaves se indica con una. apartado Punto y coma (;).

Inicie su terminal y escriba un fragmento de función multilínea. Ahora presione la tecla de flecha hacia arriba y verá que todo lo que haya escrito en varias líneas se convertirá en funciones compactas.

[name]() first_line; second_line; 
Funciones compactas

MEJOR EJERCICIO:

  1. Intente elegir cualquier sintaxis y sea coherente con ella.
  2. Cuando trabaja en un entorno colaborativo, es importante que todos sigan el mismo estándar de codificación.

Convenio de denominación

Cuando creas una función, necesitas darle un nombre a tu función. El nombre de la función debe ser descriptivo y evitar nombres ya utilizados por otras funciones, variables, constantes, etc. «Concha de serpiente» es la forma preferida de nombrar la función. En el caso de una cola, las palabras están separadas por guiones bajos.

Eche un vistazo al siguiente ejemplo. Tengo una función llamada. creado "hello_world" estilo de caja de serpiente que simplemente imprime hola mundo en stdout (terminal).

hello_world() 
echo "Running Simple Hello World Function"


hello_world

Cómo llamar a una función en Bash

Creemos una función de limpieza simple llamada "log_cleanup". El propósito de esta función es eliminar ".log" Archivos con una antigüedad superior a 30 días.

log_cleanup()
  echo "Running Cleanup On Older Logs - 30 days"
  find /home/karthick/Documents/Projects/logs/ -name "*.log" -type f -mtime +30 -delete
  echo "Cleanup Completed"

La función está definida, pero ¿es suficiente para que la función haga su trabajo? Absolutamente no. Debe llamar a la función para que se ejecute.

Para llamar a la función, simplemente ingrese el nombre de la función después de la definición de la función:

#!/usr/bin/env bash

#### FUNCTION DEFINITION ####

log_cleanup()
  echo "Running Cleanup On Older Logs - 30 days"
  find /home/karthick/Documents/Projects/logs -name "*.log" -type f -mtime +30 -delete 
  echo "Cleanup Completed"


# Calling the function

log_cleanup  
Llamar a una función en Bash
Llamar a una función en Bash

Si intenta llamar a la función antes de la definición de la función, obtendrá el siguiente mensaje de error.

line 3: log_cleanup: command not found
Comando de error no encontrado
Comando de error no encontrado

¿Porque? Cuando ejecuta el script, el código se interpreta línea por línea de arriba a abajo. Lee la función y la carga en el entorno bash (memoria). Pero aquí se llama a la función antes de que el intérprete la lea y la cargue en su entorno.

Cuando llama a una función dentro de otra función, la definición de su función puede estar en cualquier orden excepto la primera función. Eche un vistazo a la imagen de abajo. función func2 por medio de func1 y func3 por medio de func2 antes de su definición. pero func1 primero se define y luego se llama. Para el momento func1 se llama, todas las definiciones de funciones ya están interpretadas y cargadas en el entorno.

Llamar a una función desde otra función
Llamar a una función desde otra función

Estado de salida y valor de retorno

Cada comando de Linux devuelve un estado de salida (0-255). Cero se considera exitoso y el resto de los códigos de salida se dice que son errores con diferentes significados. De manera similar, cuando ejecuta una función, también devuelve el estado de finalización del último comando de ejecución en la función.

Déjame hacer la misma función de «limpieza» nuevamente. Pero he dado una ruta que no está disponible en mi computadora, por lo que find El comando fallará. yo suelo $? para obtener el estado de salida dentro del script como se muestra en la imagen.

Running Cleanup On Older Logs - 30 days
find: '/home/karthick/Documents/Projectss/logs': No such file or directory
Cleanup Completed
Exit status of function log_cleanup is ⇒ 0
Estado de salida y valor de retorno
Estado de salida y valor de retorno

El estado de salida devuelto por la función proviene del echo Comando que se ejecutó como último comando dentro de la función. Esto no es lo que cabría esperar.

Para solucionar este comportamiento, puede utilizar el bash integrado "return" Opinión.

$ type -a return
return is a shell builtin

Return acepta un número entero [N] value y termina las funciones y le da el valor de retorno a su llamador (función). Antes de usar la declaración de devolución, hay algunas reglas que debe comprender sobre el uso de la declaración de devolución. Como se mencionó anteriormente, return acepta valores enteros de 0 a 255. Una declaración de retorno usa el estado de salida del último comando ejecutado si no se pasa ningún argumento (valor entero) o el valor excede 255.

Déjame usar return para arreglarlo "cleanup" Comportamiento funcional. Aquí estoy usando declaraciones condicionales junto con el comando de retorno.

#!/usr/bin/env bash

#### FUNCTION DEFINITION ####

log_cleanup()
 echo "[ INFO ] - Running Cleanup On Older Logs - 30 days"
 if [[ -d "/home/karthick/Documents/Projectss/logs" ]]
 then
   find -name "*.log" -type f -mtime +30 -delete
   echo "[ SUCCESS] - Cleanup Completed"
 else
   echo "[ ERROR ] - Directory path wrong... Cleanup has not happened..."
   return 1
 fi


# Calling the function

log_cleanup 
echo "++ Exit status of log_cleanup function is ==> $?"

Mira el resultado a continuación. La función regresa Código de salida 1 de la instrucción de devolución.

[ INFO ] - Running Cleanup On Older Logs - 30 days
[ ERROR ] - Directory path wrong… Cleanup has not happened…
++ Exit status of log_cleanup function is ==> 1
Código de estado de salida
Código de estado de salida

Pasar argumentos a una función

Al igual que pasar argumentos a sus scripts bash, las funciones también aceptan argumentos. La parte confusa es que las funciones usan lo mismo $1$9 variables especiales para acceder a los argumentos, lo que corresponde a pasar el argumento al script. Debe comprender qué sucede cuando usa esa variable en particular dentro y fuera de la función.

cat > arg_test.sh
#!/bin/bash
echo "Value passed in $1 is = $1"

howdy()
   echo "value of $1 inside function is = $1"


howdy # Function Call

Copie y ejecute el fragmento anterior para ver la diferencia. La cuerda "Howdy" se pasa al script como primer argumento.

$ ./arg_test.sh howdy
Value passed in $1 is = howdy
value of $1 inside function is =

Se puede ver en la salida $1 se emite un valor vacío dentro de la función porque $1 dentro de la función es diferente a $1 fuera de funcionamiento, aunque tienen el mismo nombre.

Para pasar argumentos a la función, deje un espacio después del nombre de la función y pase sus argumentos como se muestra en la siguiente figura. A cada argumento separado por espacios se le asigna su respectiva variable $1$N y puede usar esta variable dentro de la función para procesar los argumentos.

log_cleanup $1 $2 ….. $N
Pasar argumentos a una función
Pasar argumentos a una función

Como puede ver en la captura de pantalla anterior, paso el nombre del directorio y el número de días como argumentos.

Área variable para una función

Si crea una variable dentro de la función o fuera de la función, se puede acceder a ella de forma global. De forma predeterminada, las variables se crean en el ámbito global.

Eche un vistazo al siguiente ejemplo. Si intenta acceder a ambas variables outside_function y inside_function, sus valores son accesibles. Esto significa que la variable creada dentro de la función es accesible globalmente aunque la función se haya ejecutado y finalizado.

 #!/bin/bash

outside_function="This variable is from outside the function"

func1()
  inside_function="This variable is from inside the func1"


func1
echo $outside_function
echo $inside_function
Variable global
Variable global

En algunos lenguajes de programación, este puede no ser el comportamiento y las variables creadas dentro de la función están disponibles durante el tiempo de ejecución de la función. Pero en bash el comportamiento es diferente.

Para hacer que las variables sean locales a la función, puede usar el bash incorporado "local" Palabra clave. La palabra clave local restringe el alcance de la variable de global a local, y solo se puede acceder a la variable mientras la función se está ejecutando.

#!/bin/bash

outside_function="This variable is from outside the function"

func1()
  local inside_function="This variable is from inside the func1"


func1
echo $outside_function
echo $inside_function
Variable local con palabra clave local
Variable local con palabra clave local

El uso de la palabra clave local le permite utilizar los mismos nombres de variable en diferentes funciones.

Nombres de variables idénticos
Nombres de variables idénticos

Aviso: Siempre debe intentar evitar los identificadores que ya se utilizan como variables, funciones, palabras clave de bash. El ejemplo anterior solo se muestra para comprender el comportamiento.

Modularidad y reutilización

Las funciones de comprensión y escritura se pueden realizar en poco tiempo. Pero escribir buenas funciones lleva tiempo con una mejor comprensión del entorno. Como ya se mencionó en la introducción, puede lograr un alto grado de modularidad y reutilización con las funciones de bash.

Pongamos un ejemplo. Ha creado 20 scripts y en cada script tiene esos log_cleanup Función que aprendimos en los apartados anteriores para realizar las tareas del hogar. En lugar de incluir esta función en los 20 scripts, puede crear una única definición de función e importarla en 20 scripts. Así es como se logra la modularidad y las funciones reutilizables. Es similar a importar Instrucciones en Python, Contiene Instrucciones en C, etc.

Eche un vistazo a la imagen de abajo. Tengo dos guiones llamados. creado script1.sh y script2.sh y el log_cleanup La función se guarda en un archivo separado llamado. escrito cleanup.sh.

Función de limpieza
Función de limpieza

Importaré la función haciendo esto source Mando. los source El comando ejecuta el archivo pasado como argumento y carga la variable o función en la sesión actual de bash. De esa manera cuando corres log_cleanup La función ya está cargada en el entorno actual y se puede acceder a ella desde otro archivo de secuencia de comandos.

Funciones de abastecimiento
Funciones de abastecimiento

En la imagen de arriba, puede comprender cuán útiles son los argumentos. Solo hay una definición de función y, según el caso de uso, puedo cambiar la función para aceptar diferentes argumentos y en diferentes scripts.

Aviso: También puede ejecutar sus scripts de shell con él source Comando que ejecuta el script en el shell actual en lugar de crear un subshell para ejecutar el script.

diploma

En esta guía, hemos discutido las funciones de bash y la definición y llamada de una función en scripts con ejemplos. Para familiarizarse con las funciones, debe practicar las funciones con varios casos de uso. Si tiene alguna pregunta o comentario, no dude en hacérnoslo saber utilizando la sección de comentarios a continuación.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba