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 :
- Essayez de choisir une syntaxe et respectez-la.
- 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_worldComment 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_cleanupSi vous essayez d'appeler la fonction avant la définition de la fonction, vous obtiendrez l'erreur suivante.
ligne 3 :log_cleanup :commande introuvablePourquoi 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 ⇒ 0Le 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 ==> 1Passer 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 fonctionCopiez 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 ….. $NComme 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
etinside_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_functionDans 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_functionSuggestion 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