23.1.
Fonctions simple
Explications:
1. On déclare une fonction nommée funky avec la syntaxe funky () { ... }
2. La fonction contient deux commandes echo qui affichent du texte
3. La fonction est appelée plus bas dans le script avec funky
4. L'exécution affiche les deux messages comme prévu
Explications:
1. La fonction fun initialise deux variables: i=0 et REPETITION=30
2. Elle affiche un message d'introduction avec echo
3. Elle fait une pause d'une seconde avec sleep $JUSTE_UNE_SECONDE
4. Une boucle while répète 30 fois un bloc qui affiche un motif ASCII
5. let "i+=1" incrémente le compteur à chaque itération
Explication
1. Erreur si appel d'une fonction non déclarée
• Si on appelle f1 avant sa définition, Bash renvoie une erreur (command not found).
• declare -f f1 ne résout rien car la fonction n'existe pas encore.
2. Déclaration des fonctions
• Une fonction (f1) peut appeler une autre fonction (f2) avant que f2 ne soit définie.
• Bash ne vérifie pas les fonctions internes lors de la déclaration, seulement lors de
l'exécution.
3. Exécution correcte après déclaration
• Une fois que f1 et f2 sont définies, l'appel f1 fonctionne :
o f1 appelle f2, qui existe désormais.
o Pas d'erreur, même si f2 était référencée avant sa définition.
1. Définition de f1 avec f2 imbriquée
• f1 contient une fonction imbriquée f2.
• f2 est définie à l'intérieur de f1, mais pas encore déclarée globalement tant
que f1 n'est pas exécutée.
2. Premier appel à f2 (avant exécution de f1)
• Erreur : f2: command not found
→ f2 n'est pas encore disponible dans la portée globale, car f1 (qui contient sa
définition) n'a pas encore été exécutée.
3. Appel de f1 (sans appel explicite de f2 à l'intérieur)
• f1 définit f2, mais ne l'appelle pas.
• Après l'exécution de f1, f2 devient disponible globalement.
4. Deuxième appel à f2 (après f1)
• Fonctionne correctement car f2 a été définie lors de l'exécution de f1.
• Explication :
o La fonction wiem_salutations est définie uniquement si $USER est "wiem".
o Portée : Comme en Bash les fonctions ont une portée globale, une fois définie,
elle reste disponible.
• Comportement :
o Si $USER = wiem → wiem_salutations existe et s'exécute.
o Sinon → Erreur command not found.
• Explication :
o Si fichier1 existe (-f), définit foo() pour le supprimer.
o Sinon, définit foo() pour afficher un message et créer un fichier bar.
23.1. Fonctions complexes et complexité des
Fonctions
Exemple 23.2. Fonction prenant des paramètres
Exemple 23.3. Fonctions et arguments en ligne de commande passés au script
1. Premier Appel : Sans Transmission d'Argument
• La fonction est appelée sans argument, donc $1 dans la fonction est vide.
• L'argument test passé au script n'est pas automatiquement transmis à la fonction.
2. Second Appel : Transmission Explicite de $1
• fonction $1 transmet explicitement l'argument test (valeur de $1 du script) à la fonction.
• La fonction reçoit donc test comme son propre $1.
Exemple 23.4. Passer une référence indirecte à une fonction
• Explications :
o $message reste "Bonjour".
o ${!message} pointe vers la nouvelle valeur de Bonjour.
Après modification de Bonjour :
Commande Valeur de $1 Sortie
echo_var "${!message}" $Bonjour → "Bonjour, de nouveau !" Bonjour, de nouveau !
Exemple 23.5. Déréférencer un paramètre passé à une fonction
Tableau Récapitulatif
Étape Commande Valeur de Crotte Sortie
Initialisation Crotte="Un texte" "Un texte" -
Étape Commande Valeur de Crotte Sortie
Avant la fonction echo $Crotte "avant" "Un texte" Un texte avant
Dans la fonction y=\$"$1" - $Crotte (affiché)
eval "expr \"$y\"" - Crotte=Un texte
Après modification eval "$1=\"...\"" "Un texte différent" -
Après la fonction echo $Crotte "après" "Un texte différent" Un texte différent après
Exemple 23.6. De nouveau, déréférencer un paramètre passé à une fonction
Explications :
1. Première Itération :
o var n'existe pas → affiche [].
o Si l'utilisateur saisit "Bonjour", var devient "Bonjour".
2. Deuxième Itération :
o Affiche [Bonjour] comme valeur par défaut.
o Si l'utilisateur saisit "Salut", var est mis à jour.
3. Troisième Itération :
o Affiche [Salut].
o Si l'utilisateur appuie sur Entrée (vide), var conserve "Salut"
4. eval force l'évaluation de $var dynamiquement.
5. -n "$var_locale" → Vérifie si la saisie est non vide.
6. Si vrai, exécute eval $1=$var_locale (met à jour la variable originale).
Exemple 23.7. Maximum de deux nombres
Version Interactive
Exemple 23.8. Convertir des nombres en chiffres romains
Exemple 23.9. Tester les valeurs de retour importantes dans une fonction
Plage de valeurs valides pour return : Bash accepte des valeurs de retour entre 0 et 255.
• Si la valeur est supérieure à 255, Bash renvoie un code d'erreur ( 1).
• Si la valeur est négative, elle est convertie en un nombre positif selon les règles
d'encodage des entiers (complément à 2).
Comportement des versions de Bash : Les versions récentes de Bash (après 2.05b) ne
supportent pas les grands nombres négatifs en tant que codes de retour valides. Les anciens
scripts qui dépendent de ce comportement peuvent ne plus fonctionner comme prévu.
Ce script illustre l'utilisation de fonctions en Bash pour gérer les valeurs passées en argument
et les codes de retour. La fonction alt_return_test affecte la valeur d'un argument à une variable
globale Val_Retour et utilise return pour renvoyer un code de sortie (limitée à 0-255).
Cependant, contrairement aux codes de retour, les variables globales comme Val_Retour
peuvent contenir des nombres plus grands que 255. Cela montre la distinction importante
entre les codes de retour, qui sont restreints, et les variables, qui n'ont pas cette limitation. Le
script met en évidence comment les valeurs supérieures à 255 (comme 256, 257, et même
25701) peuvent être assignées à des variables mais ne peuvent pas être renvoyées via return.
Exemple 23.10. Comparer deux grands entiers
Réécrire le script pour prendre en entrée des paramètres de la
ligne de commande
Ce script Bash permet de comparer deux grands entiers (potentiellement au-delà de 255,
donc non utilisables avec return) et d'afficher le plus grand. La comparaison est effectuée via
une fonction max2, qui affiche directement le résultat sur la sortie standard (stdout) au lieu de
renvoyer un code avec return,
Exemple 23.11. Vrai nom pour un utilisateur
le script détaillé ici permet d’apprendre comment :
• utiliser une boucle while pour lire un fichier ligne par ligne,
• passer des paramètres à une fonction,
• utiliser read, grep et awk en combinaison,