Comme les << vrais >> langages de programmation, Bash supporte les fonctions, bien qu'il s'agisse d'une implémentation quelque peu limitée. Une fonction est une sous-routine, un bloc de code qui implémente un ensemble d'opérations, une << boîte noire >> qui réalise une tâche spécifiée. Quand il y a un code répétitif, lorsqu'une tâche se répère avec quelques légères variations, alors utilisez une fonction.
function nom_fonction {
commande...
}
nom_fonction () {
commande...
}
Cette deuxième forme plaira aux programmeurs C (et est plus portable).
Comme en C, l'accolade ouvrante de la fonction peut apparaître de manière optionnelle sur la deuxième ligne.
nom_fonction ()
{
commande...
}
Les fonctions sont appelées, lancées, simplement en invoquant leur noms.
Exemple 23-1. Simple fonction
#!/bin/bash funky () { echo "Ceci est la fonction funky." echo "Maintenant, sortie de la fonction funky." } # La déclaration de la fonction doit précéder son appel. # Maintenant, appelons la fonction. funky exit 0 |
La définition de la fonction doit précéder son premier appel. Il n'existe pas de méthode pour << déclarer >> la fonction, comme, par exemple, en C.
# f1 # Donnera un message d'erreur, car la fonction "f1" n'est pas encore définie. # Néanmoins... f1 () { echo "Appeler la fonction \"f2\" à partir de la fonction \"f1\"." f2 } f2 () { echo "Fonction \"f2\"." } f1 # Fonction "f2" n'est pas appelé jusqu'à ce point, bien qu'il soit # référencé avant sa définition. # C'est autorisé. # Merci, S.C. |
Il est même possible d'intégrer une fonction dans une autre fonction bien que cela ne soit pas très utile.
f1 () { f2 () # intégrée { echo "La fonction \"f2\", à l'intérieur de \"f1\"." } } # f2 # Donne un message d'erreur. f1 # Ne donne rien, car appeler "f1" n'appelle pas automatiquement "f2". f2 # Maintenant, il est tout à fait correct d'appeler "f2", # car sa définition est visible en appelant "f1". # Merci, S.C. |
Les déclarations des fonctions peuvent apparaître dans des endroits bien étonnants, même là où irait plutôt une commande.
ls -l | foo() { echo "foo"; } # Autorisé, mais sans intérêt. if [ "$USER" = bozo ] then bozo_salutations () # Définition de fonction intégrée dans une construction if/then. { echo "Bonjour, Bozo." } fi bozo_salutations # Fonctionne seulement pour Bozo, et les autre utilisateurs ont une erreur. # Quelque chose comme ceci peut être utile dans certains contextes. NO_EXIT=1 # Active la définition de fonction ci-dessous. [[ $NO_EXIT -eq 1 ]] && exit() { true; } # Définition de fonction dans une "liste et". # Si $NO_EXIT vaut 1, déclare "exit ()". # Ceci désactive la commande intégrée "exit" en créant un alias vers "true". exit # Appelle la fonction "exit ()", et non pas la commande intégrée "exit". # Merci, S.C. |
Précédent | Sommaire | Suivant |
Substitution de processus | Niveau supérieur | Fonctions complexes et complexité des fonctions |