GNU/Linux >> Tutoriels Linux >  >> Linux

Bash Scripting - Fonctions expliquées avec des exemples

Dans les scripts shell Bash, les fonctions sont des moyens de regrouper l'ensemble d'instructions pour obtenir un résultat spécifique. Vous pouvez considérer les fonctions comme un mini script. Les fonctions sont également appelées procédures et méthodes dans certains langages de programmation. Les fonctions sont un excellent moyen d'atteindre la modularité et la réutilisabilité.

Dans cet article, j'expliquerai comment utiliser les fonctions dans les scripts bash sous Linux avec des exemples. Vous serez assez à l'aise avec l'utilisation des fonctions bash à la fin de cet article.

Comment définir les fonctions dans Bash

Il y a deux choses importantes que vous devez comprendre lorsque vous travaillez avec des fonctions.

  • Définir la fonction,
  • Appeler la fonction.

De la même manière que vous créez des scripts bash et que vous les exécutez, vous devez définir la fonction et l'appeler pour que la fonction s'exécute.

Il existe deux manières syntaxiques de définir une fonction dans bash. La première consiste à utiliser le mot-clé intégré bash "function" suivi du nom de la fonction. Le bloc de code sera écrit entre accolades {} .

fonction [nom] { 
Bloc de code
}

La deuxième façon est de créer une fonction sans le mot-clé "function" . Commencez par le nom de la fonction suivi de crochets.

[nom](){ 
Bloc de code
}

Laquelle choisir ? Eh bien, c'est toujours un choix personnel. Choisir l'un plutôt que l'autre n'a aucun inconvénient.

Vous pouvez également écrire des fonctions sur une seule ligne appelées fonctions compactes . Dans les fonctions compactes, chaque ligne de code à l'intérieur des accolades est séparée par un point-virgule (; ) .

Lancez votre terminal et écrivez un morceau de fonction multiligne. Appuyez maintenant sur la touche fléchée vers le haut et vous verrez que tout ce que vous avez écrit en plusieurs lignes sera converti en fonctions compactes.

[nom](){ première_ligne ; deuxième ligne; }  

BONNES PRATIQUES :

  1. Essayez de choisir une syntaxe et respectez-la.
  2. Si vous travaillez dans un environnement collaboratif, il est important que tout le monde maintienne la même norme lors du codage.

Convention de dénomination

Lorsque vous créez une fonction, vous devez donner un nom à votre fonction. Le nom de la fonction doit être descriptif et essayer d'éviter les noms qui sont déjà utilisés par d'autres fonctions, variables, constantes, etc. "Snake Case" est la meilleure façon de nommer la fonction. Dans le cas du serpent, les mots sont séparés par des traits de soulignement.

Jetez un oeil à l'exemple ci-dessous. J'ai créé une fonction nommée "hello_world" dans un style serpent qui imprimera simplement hello world sur stdout (Terminal).

hello_world () {echo "Running Simple Hello World Function"}hello_world

Comment appeler une fonction dans Bash

Créons une fonction de nettoyage simple nommée "log_cleanup" . Le but de cette fonction est de supprimer ".log" fichiers datant de plus de 30 jours.

log_cleanup(){ echo "Exécution du nettoyage sur les anciens journaux - 30 jours" find /home/karthick/Documents/Projects/logs/ -name "*.log" -type f -mtime +30 -delete echo "Nettoyage terminé "}

La fonction est définie mais cela suffira-t-il pour que la fonction fasse son travail ? Absolument pas. Vous devez appeler la fonction pour que la fonction soit exécutée.

Pour appeler la fonction, saisissez simplement le nom de la fonction après la définition de la fonction :

#!/usr/bin/env bash#### DÉFINITION DE LA FONCTION ####log_cleanup(){ echo "Exécution du nettoyage sur les anciens journaux - 30 jours" find /home/karthick/Documents/Projects/logs -name "*.log" -type f -mtime +30 -delete echo "Cleanup Completed"}# Appel de la fonction log_cleanup 

Si vous essayez d'appeler la fonction avant la définition de la fonction, vous obtiendrez l'erreur suivante.

ligne 3 :log_cleanup :commande introuvable

Pourquoi donc? Lorsque vous exécuterez le script, le code sera interprété ligne par ligne de haut en bas. Il lira la fonction et la chargera dans l'environnement bash (mémoire). Mais ici, vous appelez la fonction avant même que l'interpréteur ne lise et ne charge la fonction dans son environnement.

Lorsque vous appelez une fonction à l'intérieur d'une autre fonction, votre définition de fonction peut être dans n'importe quel ordre sauf la première fonction. Jetez un oeil à l'image ci-dessous. Fonction func2 est appelé depuis func1 et fonc3 est appelé depuis func2 avant leur définition. Mais func1 est défini en premier puis appelé. Au moment où func1 est appelée toutes les définitions de fonction sont déjà interprétées et chargées dans l'environnement.

État de sortie et valeur de retour

Chaque commande Linux renvoie un état de sortie (0-255). On dit que zéro est réussi et que les autres codes de sortie sont des échecs avec des significations différentes. De même, lorsque vous exécutez une fonction, elle renvoie également un état de sortie de la dernière commande exécutée dans la fonction.

Permettez-moi d'exécuter à nouveau la même fonction de "nettoyage". Mais j'ai donné un chemin qui n'est pas disponible sur ma machine, donc le find la commande échouera. J'utilise $? pour obtenir le statut de sortie dans le script comme indiqué dans l'image.

Exécution du nettoyage sur les journaux plus anciens - 30 jourstrouver :'/home/karthick/Documents/Projectss/logs' :aucun fichier ou répertoire de ce type Nettoyage terminéLe statut de sortie de la fonction log_cleanup est ⇒ 0 

Le statut de sortie renvoyé par la fonction provient de echo commande qui s'est exécutée comme dernière commande à l'intérieur de la fonction. Ce n'est pas le comportement auquel vous pourriez vous attendre.

Pour surmonter ce comportement, vous pouvez utiliser le bash intégré "return" déclaration.

$ type -a retour 
return est un shell intégré

Return accepte une valeur entière [N] et il quitte les fonctions et donne la valeur de retour à son appelant (fonction). Avant d'utiliser l'instruction de retour, vous devez comprendre quelques règles sur la façon d'utiliser l'instruction de retour. Comme indiqué précédemment, return accepte les valeurs entières de 0 à 255. Une instruction de retour utilisera l'état de sortie de la dernière commande exécutée si aucun argument (valeur entière) n'est passé ou si la valeur dépasse 255.

Permettez-moi d'utiliser le retour pour corriger le "cleanup" comportement de la fonction. Ici, j'utilise des instructions conditionnelles avec la commande de retour.

#!/usr/bin/env bash#### DÉFINITION DE LA FONCTION ####log_cleanup(){ echo "[ INFO ] - Exécution du nettoyage sur les anciens journaux - 30 jours" if [[ -d "/home/ karthick/Documents/Projectss/logs" ]] then find -name "*.log" -type f -mtime +30 -delete echo "[ SUCCESS] - Cleanup Completed" else echo "[ ERROR ] - Chemin de répertoire erroné... Le nettoyage n'a pas eu lieu..." return 1 fi}# Appel de la fonction log_cleanup echo "++ Le statut de sortie de la fonction log_cleanup est ==> $?"

Jetez un œil à la sortie ci-dessous. La fonction renvoie le code de sortie 1 à partir de l'instruction de retour.

[ INFO ] - Exécution du nettoyage sur les anciens journaux - 30 jours 
[ ERREUR ] - Chemin de répertoire erroné… Le nettoyage n'a pas eu lieu…
++ Le statut de sortie de la fonction log_cleanup est ==> 1

Passer des arguments à une fonction

Semblable à la transmission d'arguments à vos scripts bash, les fonctions acceptent également des arguments. La partie déroutante est que les fonctions utilisent le même $1$9 des variables spéciales pour accéder aux arguments, ce qui revient à passer l'argument au script. Vous devez comprendre ce qui se passe lorsque vous utilisez cette variable spéciale à l'intérieur et à l'extérieur de la fonction.

cat> arg_test.sh#!/bin/bashecho "La valeur passée dans \$1 est =$1"howdy(){ echo "la valeur de \$1 dans la fonction est =$1"}howdy # Appel de fonction

Copiez et exécutez l'extrait ci-dessus pour voir la différence. La chaîne "Howdy" est passé comme premier argument au script.

$ ./arg_test.sh bonjour 
La valeur passée dans $1 est =bonjour
la valeur de $1 à l'intérieur de la fonction est =

À partir de la sortie, vous pouvez voir $1 à l'intérieur de la fonction imprime une valeur vide car $1 à l'intérieur de la fonction est différent de $1 en dehors de la fonction bien qu'ils partagent le même nom.

Pour passer des arguments à la fonction, après le nom de la fonction, laissez un espace et passez vos arguments comme indiqué dans l'image ci-dessous. Chaque argument séparé par un espace sera assigné avec sa variable respective $1$N et vous pouvez utiliser cette variable dans la fonction pour traiter les arguments.

log_cleanup $1 $2 ….. $N

Comme vous le voyez dans la capture d'écran ci-dessus, je passe le nom du répertoire et le nombre de jours comme arguments.

Périmètre variable pour une fonction

Lorsque vous créez une variable à l'intérieur ou à l'extérieur de la fonction, elle est accessible globalement. Par défaut, les variables sont créées dans la portée globale.

Jetez un oeil à l'exemple ci-dessous. Si vous essayez d'accéder à la fois à la variable outside_function et inside_function , leurs valeurs sont accessibles. Cela signifie que même si la fonction s'est exécutée et s'est terminée, la variable créée à l'intérieur de la fonction est accessible globalement.

 #!/bin/bashoutside_function="Cette variable est de l'extérieur de la fonction"func1(){ inside_function="Cette variable est de l'intérieur de la func1"}func1echo $outside_functionecho $inside_function

Dans certains langages de programmation, cela peut ne pas être le comportement et les variables créées à l'intérieur de la fonction seront disponibles pendant l'exécution de la fonction. Mais en bash, le comportement est différent.

Pour rendre les variables locales à la fonction, vous pouvez utiliser le bash intégré "local" mot-clé. Le mot-clé local restreindra la portée de la variable de global à local et la variable ne sera accessible que pendant l'exécution de la fonction.

#!/bin/bashoutside_function="Cette variable est extérieure à la fonction"func1(){ local inside_function="Cette variable provient de l'intérieur de la fonction1"}func1echo $outside_functionecho $inside_function

Suggestion de lecture :

  • Scripts bash – Variables expliquées à l'aide d'exemples

Lorsque le mot-clé local est utilisé, vous pouvez utiliser les mêmes noms de variable dans différentes fonctions.

Attention : Vous devriez toujours essayer d'éviter d'utiliser des identifiants qui sont déjà utilisés comme variables, fonctions, mots-clés bash. L'exemple ci-dessus est montré juste pour comprendre le comportement.

Modularité et resubaility

Les fonctions de compréhension et d'écriture peuvent être effectuées rapidement. Mais écrire de bonnes fonctions prend du temps avec une meilleure compréhension de l'environnement. Comme déjà souligné dans la section d'introduction, avec les fonctions bash, vous pouvez obtenir une grande modularité et réutilisabilité.

Prenons un exemple. Vous avez créé 20 scripts et dans chaque script, vous avez inclus le log_cleanup fonction que nous avons vu dans les sections précédentes pour effectuer des tâches de ménage. Au lieu d'inclure cette fonction dans les 20 scripts, vous pouvez créer une seule définition de fonction et l'importer dans 20 scripts. De cette façon, vous obtenez une modularité ainsi que des fonctions réutilisables. Ceci est similaire à importer instructions en python, inclure déclarations en C, etc.

Jetez un oeil à l'image ci-dessous. J'ai créé deux scripts nommés script1.sh et script2.sh et le log_cleanup la fonction est écrite dans un fichier séparé nommé cleanup.sh .

J'importe la fonction en exécutant le source commande. Le source La commande exécutera le fichier passé en argument et chargera la variable ou les fonctions dans la session bash en cours. De cette façon lorsque vous exécutez log_cleanup à partir d'un autre fichier de script, la fonction est déjà chargée dans l'environnement actuel et accessible.

À partir de l'image ci-dessus, vous pouvez comprendre à quel point les arguments sont utiles. Il n'y a qu'une seule définition de fonction et selon le cas d'utilisation, je peux modifier la fonction pour accepter différents arguments et dans différents scripts.

Attention : Vous pouvez également exécuter vos scripts shell avec source commande qui exécutera le script dans le shell actuel au lieu de créer un sous-shell pour exécuter le script.

Conclusion

Dans ce guide, nous avons discuté des fonctions Bash et de la façon de définir et d'appeler une fonction dans des scripts avec des exemples. Pour vous familiariser avec les fonctions, vous devez pratiquer les fonctions avec différents cas d'utilisation. Si vous avez des questions ou des commentaires, n'hésitez pas à nous le faire savoir via la section des commentaires ci-dessous.

Lire connexe :

  • Scripts bash – Explication de la boucle For avec des exemples
  • Scripts bash :boucle While et Until expliquée à l'aide d'exemples
  • Différence entre la définition de variables bash avec et sans exportation
  • La commande Bash Echo expliquée avec des exemples sous Linux
  • Tutoriel Bash Heredoc pour les débutants
  • La redirection bash expliquée avec des exemples

Linux
  1. Comment écrire un script bash avec des exemples

  2. Fonctions bash

  3. Shell Scripting Partie V :Fonctions dans Bash

  4. Fonctions dans les variables shell ?

  5. Instruction Bash If-Else avec des exemples

Commande Tr sous Linux expliquée avec des exemples

Bash Scripting Part6 - Créer et utiliser des fonctions Bash

Bash Scripting Part2 - Boucles For et While avec exemples

Tutoriel d'introduction aux scripts Bash avec 5 exemples pratiques

Tutoriel sur les fonctions Bash Shell avec 6 exemples pratiques

Script bash pour la boucle expliqué avec des exemples