Apprenez en lisant dans l'ordre

Fonctions — regrouper un traitement répété en un seul endroit

Cet article fait partie du Cours Linux, qui vous permet de maîtriser à partir de zéro des compétences Linux concrètes, des commandes de base jusqu'aux scripts shell.
Définis une logique avec name() { ... }, reçois des arguments via $1, garde des variables propres à la fonction avec local, et branche sur le succès avec return et $? pour réutiliser la même logique de validation — illustré et mis en pratique dans un terminal de navigateur.

Donner un nom à un bloc de logique — définir des fonctions et des arguments

Au lieu d'écrire la même logique encore et encore, tu peux l'envelopper dans une fonction et l'appeler par son nom.

Définis-en une avec name() { ... }, et place le corps entre { et }.

Une fois définie, écris simplement name pour exécuter cette logique.

Cela découpe un long script en unités significatives, et tu ne corriges les choses qu'à un seul endroit.

Pour passer des valeurs à une fonction, ajoute des arguments après le nom lors de l'appel, comme name foo bar.

À l'intérieur de la fonction, $1 est le premier argument et $2 le second (la même notation que les paramètres positionnels du script lui-même).

Entoure un argument de guillemets doubles avec "$1", et même une valeur contenant des espaces est traitée comme un seul argument.

greet() {                        # définir une fonction
  echo "hello, $1"
}
greet alice                      # hello, alice
greet bob                        # hello, bob
Comment un appel se relie aux arguments
greet alice bob$1 = alice$2 = bobutiliser $1 $2 dans le corps1er2edans greet
Les valeurs de greet alice bob entrent dans $1 et $2, et le corps de la fonction les utilise pour faire son travail.
SyntaxeSignificationExemple
name() { … }Définir une fonctiongreet() { echo "hi $1"; }
name argsAppeler une fonctiongreet alice
$1Référencer le premier argument dans la fonctionecho "name=$1"
$2Référencer le second argument dans la fonctionecho "port=$2"

Crée un script utilitaire qui regroupe la validation d'entrée dans une fonction et la réutilise.

① Ouvre validate.sh avec vi validate.sh, appuie sur i pour passer en mode insertion, et écris #!/bin/sh sur la première ligne.

② Définis une fonction qui reçoit une valeur, vérifie si elle est vide, et affiche le résultat. Référence l'argument avec $1 dans la fonction.

③ Appelle la fonction plusieurs fois avec des valeurs différentes.

④ Appuie sur Esc et enregistre avec :wq, puis rends le script exécutable et lance-le pour vérifier le résultat de chaque appel.

⑤ Si tu ne sais pas quoi écrire, tu peux copier le contenu depuis le panneau de réponse et le coller dans le mode insertion de vi. (Exécute-le correctement et l'explication apparaîtra.)

Linux console
0 / 3 exécutée(s)
Loading Linux Terminal...

Des variables qui ne vivent qu'à l'intérieur d'une fonction — local

Quand tu déclares local v=... dans une fonction, cette variable n'est valide qu'à l'intérieur de la fonction et disparaît quand la fonction se termine.

Sans local, tu écrases aussi une variable du même nom à l'extérieur de la fonction, ce qui provoque des effets de bord inattendus.

Pour réutiliser une fonction en toute sécurité comme un composant, rends local les variables de travail qu'elle utilise en interne.

msg="outer"
show() {
  local msg="inner"            # variable seulement dans la fonction
  echo "in func: $msg"
}
show                           # in func: inner
echo "outside: $msg"           # outside: outer (inchangé à l'extérieur)
Ce que local rend visible
msg=outerecho "$msg"affiche outerlocal msg=innerecho "$msg"affiche innertout le scriptdans la fonction (local)
Une variable normale est visible partout, tandis qu'une variable local n'est valide qu'à l'intérieur de la fonction. Même avec le même nom, la valeur extérieure ne change pas.
SyntaxeSignificationExemple
local v=…Créer une variable valide seulement dans la fonctionlocal step=1
v=…Une variable valide dans tout le scriptstatus=ready

Crée un script qui rend une variable de travail local et confirme qu'elle n'affecte pas l'extérieur.

① Ouvre scope.sh avec vi scope.sh, appuie sur i pour passer en mode insertion, et écris #!/bin/sh sur la première ligne.

② Définis une variable à l'extérieur, puis définis une fonction qui déclare une variable du même nom avec local et lui donne une valeur différente.

③ Après avoir appelé la fonction, affiche la variable extérieure pour confirmer que sa valeur n'a pas changé.

④ Appuie sur Esc et enregistre avec :wq, puis rends le script exécutable et lance-le.

⑤ Si tu ne sais pas quoi écrire, tu peux copier le contenu depuis le panneau de réponse et le coller dans le mode insertion de vi.

Linux console
0 / 3 exécutée(s)
Loading Linux Terminal...

Renvoyer un succès ou un échec — return et $?

Une fonction peut renvoyer un code de sortie avec return N.

Par convention 0 signifie succès et toute valeur autre que 0 signifie échec, et juste après l'appel tu peux vérifier cette valeur avec $?.

Brancher directement sur le succès d'une fonction comme if check "$x"; then ... rend le flux de validation et de traitement plus facile à lire.

is_num() {
  case "$1" in
    *[!0-9]*|"") return 1 ;;     # échec s'il contient un caractère non numérique ou est vide
    *) return 0 ;;
  esac
}
is_num 12; echo "12 -> $?"       # 12 -> 0
is_num abc; echo "abc -> $?"     # abc -> 1
De return au branchement sur $?
is_num "$1"return 0return 1chemin de succèschemin d'échecun nombrepas un nombre$? = 0 → succès$? = 1 → échec
La valeur de return entre dans $?, et if branche en traitant 0 comme un succès et une valeur non nulle comme un échec.
SyntaxeSignificationExemple
return 0Quitter la fonction comme un succèsis_num 12; # success
return 1Quitter la fonction comme un échecis_num abc; # failure
$?Vérifier la valeur de retour de la fonction précédenteis_num 12; echo $?
if name x; then …Brancher directement sur la valeur de retourif is_num "$v"; then …; fi

Crée une fonction qui décide si une valeur est un nombre, et un script qui branche sur sa valeur de retour.

① Ouvre isnum.sh avec vi isnum.sh, appuie sur i pour passer en mode insertion, et écris #!/bin/sh sur la première ligne.

② Définis une fonction qui vérifie si la valeur reçue ne contient que des chiffres, renvoyant return 0 si c'est un nombre et return 1 sinon.

③ Place cette fonction directement dans une condition if et affiche un message de succès ou d'échec pour plusieurs entrées.

④ Appuie sur Esc et enregistre avec :wq, puis rends le script exécutable et lance-le pour vérifier les résultats.

⑤ Si tu ne sais pas quoi écrire, tu peux copier le contenu depuis le panneau de réponse et le coller dans le mode insertion de vi.

Linux console
0 / 3 exécutée(s)
Loading Linux Terminal...
QUIZ

Vérification des connaissances

Répondez à chaque question une par une.

Question 1Quelle notation référence le premier argument dans une fonction shell ?

Question 2Quelle est la portée d'une variable déclarée avec local ?

Question 3Lequel vérifie la valeur de retour de la fonction la plus récente ?