GNU/Linux >> Tutoriels Linux >  >> Linux

Bash Beginner Series #9 :Utiliser des fonctions dans Bash

Lorsque vos scripts bash deviennent de plus en plus gros, les choses peuvent devenir très compliquées !

Vous pouvez vous retrouver à réécrire les mêmes morceaux de code encore et encore dans différentes parties de vos scripts bash.

Heureusement, vous pouvez éviter de réécrire du code en utilisant des fonctions dans bash qui rendront vos scripts plus organisés et lisibles.

Dans ce didacticiel, vous apprendrez à créer des fonctions, à renvoyer des valeurs de fonction et à transmettre des arguments de fonction dans des scripts shell bash.

De plus, vous apprendrez comment fonctionne la portée des variables et comment définir des fonctions récursives.

Créer des fonctions dans bash

Il existe deux syntaxes différentes pour déclarer les fonctions bash. La syntaxe suivante est la méthode la plus couramment utilisée pour créer des fonctions bash :

function_name () {
commands
}

La deuxième moins couramment utilisée pour créer des fonctions bash commence par la fonction de travail réservée suivie du nom de la fonction comme suit :

function function_name {
commands
}

Il y a maintenant deux choses dont vous devez être conscient lorsque vous travaillez avec des fonctions :

  • Une fonction ne s'exécutera/s'exécutera jamais à moins que vous n'invoquiez/appeliez la fonction.
  • La définition de la fonction doit précéder tout appel à la fonction.

Chaque fois que vous voulez qu'une fonction s'exécute, il vous suffit de l'appeler ! Un appel de fonction se fait en référençant simplement le nom de la fonction.

Jetez un œil au fun.sh suivant script bash :

#!/bin/bash

hello () {
echo "Hello World"
}

hello
hello
hello

J'ai défini une fonction nommée bonjour qui fait simplement écho à la ligne "Hello World" à la borne. Remarquez que j'ai fait trois bonjour appels de fonction et donc si vous exécutez le script, vous verrez le "Hello World" ligne imprimée trois fois à l'écran :

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

Renvoyer des valeurs de fonction dans bash

Dans de nombreux langages de programmation, les fonctions renvoient une valeur lorsqu'elles sont appelées; cependant, ce n'est pas le cas avec bash car les fonctions bash ne renvoient pas de valeurs.

Lorsqu'une fonction bash termine son exécution, elle renvoie l'état de sortie de la dernière commande exécutée capturée dans le $? variable. Zéro indique une exécution réussie ou un entier positif non nul (1-255) pour indiquer un échec.

Vous pouvez utiliser un retour instruction pour modifier le statut de sortie de la fonction. Par exemple, jetez un œil au fichier suivant error.sh script :

#! /bin/bash

error () {
blabla
return 0
}

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

Si vous exécutez le error.sh bash, vous pourriez être surpris du résultat :

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

Sans le retour 0 déclaration, l'erreur la fonction n'aurait jamais renvoyé un statut de sortie différent de zéro comme blabla est le résultat d'une commande introuvable erreur.

Donc, comme vous pouvez le voir, même si les fonctions bash ne renvoient pas de valeurs, j'ai fait une solution de contournement en modifiant les statuts de sortie des fonctions.

Vous devez également savoir qu'une instruction return termine immédiatement une fonction.

Passer des arguments à la fonction bash

Vous pouvez passer des arguments à une fonction tout comme vous pouvez passer des arguments à un script bash. Vous incluez simplement les arguments lorsque vous effectuez l'appel de fonction.

Pour illustrer, jetons un coup d'œil à ce qui suit iseven.sh script 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

Le iseven() La fonction teste si un nombre est pair ou impair. J'ai fait quatre appels de fonction à iseven() . Pour chaque appel de fonction, j'ai fourni un nombre qui est la première augmentation de la fonction iseven() et est référencé par le $1 variable dans la définition de la fonction.

Lançons le iseven.sh script bash pour s'assurer qu'il fonctionne :

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

Vous devez également être bien conscient que les arguments de la fonction bash et les arguments du script bash sont deux choses différentes. Pour contraster la différence, jetez un oeil à ce qui suit funarg.sh script 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

Exécutez le script avec quelques arguments et observez le résultat :

[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()

Comme vous pouvez le voir, même si vous avez utilisé les mêmes variables $1 et $2 pour faire référence à la fois aux arguments du script et aux arguments de la fonction, elles produisent des résultats différents lorsqu'elles sont appelées depuis une fonction.

Variables locales et globales dans les fonctions bash

Les variables bash peuvent avoir une portée globale ou locale. Vous pouvez accéder à une variable globale n'importe où dans un script bash, quelle que soit sa portée. Au contraire, une variable locale n'est accessible qu'à partir de sa définition de fonction.

Pour démontrer, jetez un oeil à la suivante scope.sh script 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"

J'ai d'abord défini deux variables globales v1 et v2 . Puis à l'intérieur de myfun() définition, j'ai utilisé le local mot clé pour définir une variable locale v1 et modifié la variable globale v2. Notez que vous pouvez utiliser le même nom de variable pour les variables locales dans différentes fonctions.

Exécutons maintenant le 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

À partir de la sortie du script, vous pouvez conclure ce qui suit :

  • Une variable locale portant le même nom qu'une variable globale aura priorité sur les variables globales à l'intérieur d'un corps de fonction.
  • Vous pouvez modifier une variable globale depuis une fonction.

Fonctions récursives

Une fonction récursive est une fonction qui s'appelle elle-même ! Les fonctions récursives sont utiles lorsque vous essayez de résoudre un problème de programmation qui peut être décomposé en sous-problèmes plus petits.

La fonction factorielle est un exemple classique de fonction récursive. Jetez un œil au fichier factorial.sh suivant script 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

Toute fonction récursive doit commencer par un cas de base qui est nécessairement de mettre fin à la chaîne d'appels de fonctions récursives. Dans le factoriel() fonction, le cas de base est défini comme suit :

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

Dérivez maintenant le cas récursif pour la fonction factorielle. Pour calculer la factorielle d'un nombre nn est un nombre positif supérieur à un, vous pouvez multiplier n par le factoriel de n-1 :

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

Utilisons l'équation ci-dessus pour écrire ce cas récursif :

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

Exécutez maintenant le script et assurez-vous d'obtenir les bons résultats :

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

Comme exercice supplémentaire, essayez d'écrire une fonction récursive pour calculer le nième nombre de Fibonacci. Tout d'abord, essayez de trouver le cas de base, puis le cas récursif ; vous avez compris !

Vous avez besoin de plus d'exercice? Téléchargez le PDF ci-dessous et exercez-vous aux fonctions des scripts bash. Vous avez également les solutions dans le même PDF.

Bash Chapter 9 Practice QuestionsProblems et leur solution pour mettre en pratique ce que vous venez d'apprendre dans ce chapitreBash-Chapter-9-Practice-Questions-Linux-Handbook.pdf31 KB

Génial! Le prochain et dernier chapitre de cette série appliquera tout ce que vous avez appris jusqu'à présent pour écrire des scripts bash efficaces qui automatisent les tâches administratives ennuyeuses.


Linux
  1. Utilisation de Bash pour l'automatisation

  2. Fonctions dans les variables shell ?

  3. Bash Beginner Series #8 :Boucles dans Bash

  4. Utilisation des déclarations de cas dans Bash

  5. Comment créer et appeler des fonctions dans Bash

Bash Beginner Series #3 :Passer des arguments aux scripts Bash

Bash Beginner Series #7 :Prise de décision avec des instructions If Else et Case Statements

Bash Beginner Series #6 :Opérations sur les chaînes dans Bash

Bash Beginner Series #10 :Automatisation avec Bash

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

Tutoriel sur les fonctions Bash Shell avec 6 exemples pratiques