Les fonctions Shell

ShellBeginner
Pratiquer maintenant

Introduction

Dans cet atelier, nous allons explorer les fonctions shell sous Linux. Les fonctions shell sont des blocs de code réutilisables qui exécutent des tâches spécifiques, rendant nos scripts plus organisés et plus efficaces. Nous apprendrons comment créer, appeler et utiliser des fonctions avec des paramètres dans les scripts shell. Cet atelier est conçu pour les débutants, nous procéderons donc étape par étape en expliquant chaque concept en détail.

Créer votre première fonction Shell

Commençons par créer une fonction shell simple. Les fonctions shell sont comme des mini-scripts à l'intérieur d'un script plus large, vous permettant de regrouper des commandes qui effectuent une tâche spécifique.

Tout d'abord, nous devons créer un nouveau fichier. Ouvrez votre terminal et tapez :

cd ~/project
touch functions.sh

Cette commande vous déplace dans le répertoire project et crée un nouveau fichier nommé functions.sh. Ce fichier contiendra nos fonctions shell.

Maintenant, ajoutons notre première fonction :

#!/bin/bash

## This is a simple function
greet() {
  echo "Hello, World!"
}

## This line calls (runs) the function
greet

Analysons ce code :

  • La première ligne #!/bin/bash est appelée un shebang. Elle indique au système d'utiliser bash pour interpréter ce script.
  • Nous définissons notre fonction avec greet() { }. Tout ce qui se trouve entre les accolades fait partie de la fonction.
  • À l'intérieur de la fonction, nous avons une simple commande echo qui affiche "Hello, World!".
  • La dernière ligne greet appelle (exécute) notre fonction.

Maintenant, rendons notre script exécutable et lançons-le :

chmod +x functions.sh
./functions.sh

Vous devriez voir s'afficher :

Hello, World!

Si vous ne voyez pas ce résultat, vérifiez que vous avez correctement saisi tout le contenu dans le fichier functions.sh.

Fonctions avec paramètres

Maintenant que nous avons créé une fonction de base, rendons-la plus flexible en ajoutant des paramètres. Les paramètres nous permettent de transmettre des informations à nos fonctions.

Ouvrez à nouveau le fichier functions.sh et remplacez son contenu par le code suivant :

#!/bin/bash

## Function with a parameter
greet() {
  echo "Hello, $1!"
}

## Function with multiple parameters
calculate() {
  echo "The sum of $1 and $2 is $(($1 + $2))"
}

## Call functions with arguments
greet "Alice"
calculate 5 3

Examinons ce code :

  • Dans la fonction greet, $1 fait référence au premier argument passé à la fonction.
  • Dans la fonction calculate, $1 et $2 font respectivement référence au premier et au deuxième argument.
  • $(($1 + $2)) effectue l'addition arithmétique des deux paramètres.

Exécutez le script :

./functions.sh

Vous devriez voir :

Hello, Alice!
The sum of 5 and 3 is 8

Si vous n'obtenez pas ce résultat, assurez-vous d'avoir correctement enregistré les modifications du fichier.

Valeurs de retour des fonctions

En scripting shell, les fonctions ne retournent pas de valeurs de la même manière que dans d'autres langages de programmation. À la place, elles peuvent soit afficher un résultat (via echo) qui peut être capturé, soit modifier une variable globale. Explorons ces deux méthodes.

Ouvrez à nouveau functions.sh et mettez à jour le contenu avec le code suivant :

#!/bin/bash

## Function that echoes a result
get_square() {
  echo $(($1 * $1))
}

## Function that modifies a global variable
RESULT=0
set_global_result() {
  RESULT=$(($1 * $1))
}

## Capture the echoed result
square_of_5=$(get_square 5)
echo "The square of 5 is $square_of_5"

## Use the function to modify the global variable
set_global_result 6
echo "The square of 6 is $RESULT"

Décortiquons cela :

  • La fonction get_square utilise echo pour sortir le résultat, que nous capturons en utilisant la syntaxe $().
  • La fonction set_global_result modifie directement la variable globale RESULT.
  • Nous utilisons $() pour capturer la sortie de get_square dans une variable.
  • Nous appelons set_global_result, qui modifie RESULT, puis nous affichons la valeur de RESULT.

Enregistrez le fichier et exécutez-le :

./functions.sh

Vous devriez voir :

The square of 5 is 25
The square of 6 is 36

Si ce n'est pas le cas, vérifiez que votre fichier functions.sh ne contient pas de fautes de frappe.

Comprendre la portée des variables

Dans les scripts shell, les variables sont globales par défaut. Cela signifie qu'elles sont accessibles de n'importe où dans le script. Cependant, vous pouvez utiliser le mot-clé local pour créer des variables qui ne sont accessibles qu'à l'intérieur d'une fonction. C'est ce qu'on appelle la portée locale.

Modifions notre fichier functions.sh pour illustrer ce concept.

Mettez à jour le contenu avec le code suivant :

#!/bin/bash

## Global variable
GLOBAL_VAR="I'm global"

## Function with a local variable
demonstrate_scope() {
  local LOCAL_VAR="I'm local"
  echo "Inside function: GLOBAL_VAR = $GLOBAL_VAR"
  echo "Inside function: LOCAL_VAR = $LOCAL_VAR"
}

## Call the function
demonstrate_scope

echo "Outside function: GLOBAL_VAR = $GLOBAL_VAR"
echo "Outside function: LOCAL_VAR = $LOCAL_VAR"

Voici ce qui se passe dans ce script :

  • Nous définissons une variable globale GLOBAL_VAR.
  • À l'intérieur de la fonction demonstrate_scope, nous définissons une variable locale LOCAL_VAR à l'aide du mot-clé local.
  • Nous affichons les deux variables à l'intérieur de la fonction.
  • Après avoir appelé la fonction, nous essayons d'afficher à nouveau les deux variables à l'extérieur de celle-ci.

Enregistrez le fichier et lancez-le :

./functions.sh

Vous devriez voir un résultat similaire à celui-ci :

Inside function: GLOBAL_VAR = I'm global
Inside function: LOCAL_VAR = I'm local
Outside function: GLOBAL_VAR = I'm global
Outside function: LOCAL_VAR =

Remarquez que LOCAL_VAR est vide lorsqu'on tente d'y accéder en dehors de la fonction. C'est parce que les variables locales n'existent que dans la fonction où elles ont été définies.

Fonction avancée - ENGLISH_CALC

Maintenant que nous avons couvert les bases des fonctions shell, créons une fonction plus avancée nommée ENGLISH_CALC. Cette fonction prendra trois arguments : deux nombres et une opération (plus, minus ou times).

Remplacez le contenu du fichier par le code suivant :

#!/bin/bash

ENGLISH_CALC() {
  local num1=$1
  local operation=$2
  local num2=$3
  local result

  case $operation in
    plus)
      result=$((num1 + num2))
      echo "$num1 + $num2 = $result"
      ;;
    minus)
      result=$((num1 - num2))
      echo "$num1 - $num2 = $result"
      ;;
    times)
      result=$((num1 * num2))
      echo "$num1 * $num2 = $result"
      ;;
    *)
      echo "Invalid operation. Please use 'plus', 'minus', or 'times'."
      return 1
      ;;
  esac
}

## Test the function
ENGLISH_CALC 3 plus 5
ENGLISH_CALC 5 minus 1
ENGLISH_CALC 4 times 6
ENGLISH_CALC 2 divide 2 ## This should show an error message

Analysons cette fonction :

  • Nous utilisons des variables local pour stocker nos entrées et nos résultats. C'est une bonne pratique pour éviter d'interférer avec d'éventuelles variables globales.
  • Nous utilisons une instruction case pour gérer les différentes opérations. Cela ressemble à l'instruction "switch" dans d'autres langages.
  • Pour chaque opération valide, nous effectuons le calcul et affichons le résultat.
  • Si une opération non valide est fournie, nous affichons un message d'erreur et retournons 1 (dans les scripts shell, une valeur de retour non nulle indique une erreur).
  • À la fin, nous testons notre fonction avec diverses entrées, y compris une opération invalide.

Enregistrez le fichier et exécutez-le :

./functions.sh

Vous devriez obtenir le résultat suivant :

3 + 5 = 8
5 - 1 = 4
4 * 6 = 24
Invalid operation. Please use 'plus', 'minus', or 'times'.

Si vous ne voyez pas ce résultat, vérifiez attentivement votre fichier functions.sh pour détecter d'éventuelles erreurs de saisie.

Résumé

Dans cet atelier, nous avons exploré les fonctions shell sous Linux, en partant des bases pour progresser vers des concepts plus avancés. Nous avons appris à :

  1. Créer et appeler des fonctions simples.
  2. Manipuler les paramètres de fonction.
  3. Retourner des valeurs de fonctions en utilisant echo et des variables globales.
  4. Comprendre la portée des variables et utiliser des variables locales.
  5. Créer une fonction plus complexe capable de traiter des opérations arithmétiques.

Les fonctions shell sont des outils puissants qui vous aident à écrire du code plus organisé, efficace et réutilisable. Elles vous permettent de décomposer des scripts complexes en morceaux plus petits et gérables, rendant vos scripts plus faciles à comprendre et à maintenir.

En maîtrisant les fonctions shell, vous serez en mesure d'écrire des scripts plus sophistiqués et d'automatiser des tâches complexes plus efficacement dans un environnement Linux. N'oubliez pas que la pratique est essentielle pour devenir compétent en scripting shell. Essayez de modifier les fonctions que nous avons créées ou d'en créer de nouvelles pour résoudre des problèmes spécifiques que vous rencontrez dans votre utilisation de Linux.