connectiva penguin bsd logo

Les scripts bash

1_Notre premier script

2_Les variables

3_Les commandes composées    (; | & || && $() {} ``)

4_Ecriture à l'écran / lecture au clavier    (echo read)

5_Le passage de paramètres

6_Les structures conditionnelles    (if then else while until)

7_Les autres structures    (for in do case select)

8_Les fonctions

9_Pour aller plus loin


8_Les fonctions

Pour simplifier et rendre plus lisible les scripts, bash permet l'utilisation de fonctions. Une fonction est un sous-programme qui peut être appelé n'importe quand, et aussi souvant que nécéssaire. On peut lui envoyer des variables, et elle peut nous retourner un résultat. A l'intérieur d'une fonction, on peut créer une variable locale (qui n'existe qu'à l'intérieur de la fonction) avec le mot clé "local".

On accède aux paramètres de la fonction de la même façon que dans un script, avec les variables $#, $*, $@, $1, $2, etc. Seul $0 ne change pas (pour rappel, $0 affiche le nom du script).

Pour renvoyer un valeur au programme principal, c'est le mot clé "return" qui est utilisé. Sinon, c'est le résultat de la dernière commande exécutée qui est renvoyé.

Une fonction peut s'appeler elle-même. On dit qu'elle est récursive.

Attention : il faut utiliser la commande "exit" avec prudence, car elle ne termine pas seulement la fonction, mais aussi le script !

Pour déclarer une fonction, soit on met un nom suivit de "()", soit on met le mot clé "function" suivit d'un nom (sans parenthèses). Puis on met le contenu de la fonction entre crochets.

Remarque 1 : on ne doit pas mettre à la fois le mot clé "function" et les parenthèses, bien que certains shells récents l'acceptent.

Remarque 2 : il n'y a pas d'importance à utiliser l'une ou l'autre syntaxe, mais la syntaxe avec les parenthèses est plus portable avec les très vieux shells.

Voici la syntaxe :

# declaration de la fonction
nom_de_la_fonction()
# ou : function nom_de_la_fonction
{ actions }

# programme principal
...
actions
...
nom_de_la_fonction # sans parentheses
nom_de_la_fonction $variable # si on doit passer un parametre a la fonction
variable=$? # recupere le resultat de la fonction
...
actions
...

Et comme rien ne vaut un exemple, le voici. Dans cet exemple, on déclare deux fonctions ; l'une calcule le carré d'un nombre, l'autre sa factorielle.

#!/bin/bash
# utilisation des fonctions

function carre
{
return $[ $1 * $1 ];
}

function factorielle
{
  local x=$1
  local resultat=1
  while [ $x -ge 1 ]; do
    resultat=$[ $x * $resultat ]
    let $[ x-= 1 ];
  done
  return $resultat;
}

# programme principal
echo -n "Tapez un nombre positif : "
read nb
carre $nb ; CARRE=$? # execute la fonction et recupere la valeur
echo "nb * nb = $CARRE"
factorielle $nb ; FACTORIELLE=$? # execute la fonction et recupere la valeur
echo "factorielle : $nb! = $FACTORIELLE"

Ce qui nous donne à l'écran :

$ ./test.sh
Tapez un nombre positif : 5
nb * nb = 25
factorielle : 5! = 120

On remarque bien que le programme principal est beaucoup plus lisible que si on n'avait pas fait appel aux fonctions. Et bien sûr, si on doit faire appel plusieurs fois à la même fonction, l'interêt est encore plus évident.

<< page précédente
7_Les autres structures
page suivante >>
9_Pour aller plus loin

Dernière mise à jour : 10 janvier 2010

Valid XHTML 1.1

logo firefox logo ubuntu logo debian logo mandriva logo gimp