Les variables spéciales en Shell

ShellBeginner
Pratiquer maintenant

Introduction

Dans cet atelier, vous allez découvrir les variables spéciales de la programmation shell. Ces variables fournissent des informations essentielles sur l'environnement d'exécution du script, telles que les arguments passés en ligne de commande, le nom du script ou encore l'identifiant du processus (PID). La maîtrise de ces variables vous permettra d'écrire des scripts shell plus flexibles et plus performants.

Création de votre premier script

Commençons par créer un script shell simple pour illustrer l'utilisation des variables spéciales.

  1. Ouvrez votre terminal dans l'interface WebIDE. Vous devriez voir une invite de commande prête à recevoir vos instructions.

  2. Naviguez vers le répertoire du projet :

cd ~/project

Cette commande change votre répertoire actuel pour ~/project, qui est votre espace de travail par défaut pour cet atelier.

  1. Créez un nouveau fichier nommé special_vars.sh à l'aide de la commande suivante :
touch special_vars.sh

La commande touch crée un fichier vide s'il n'existe pas, ou met à jour sa date de modification s'il existe déjà.

  1. Ouvrez le fichier dans l'éditeur de la WebIDE. Vous pouvez le faire en cliquant sur le nom du fichier dans l'explorateur de fichiers situé sur le côté gauche de votre écran.

  2. Ajoutez le contenu suivant au fichier :

#!/bin/bash

echo "Script Name: $0"
echo "First Argument: $1"
echo "Second Argument: $2"
echo "All Arguments: $@"
echo "Number of Arguments: $#"
echo "Process ID: $$"

Analysons le rôle de chaque ligne :

  • #!/bin/bash : C'est ce qu'on appelle le "shebang". Il indique au système d'utiliser l'interpréteur bash pour exécuter ce script.
  • $0 : Cette variable spéciale contient le nom du script.
  • $1 et $2 : Elles représentent respectivement le premier et le deuxième argument passés en ligne de commande.
  • $@ : Cette variable représente l'ensemble des arguments passés au script.
  • $# : Elle donne le nombre total d'arguments fournis.
  • $$ : Elle fournit l'identifiant de processus (PID) du shell actuel.
  1. Enregistrez le fichier après avoir ajouté le contenu.

  2. Rendez le script exécutable en lançant la commande suivante dans votre terminal :

chmod +x special_vars.sh

La commande chmod modifie les permissions d'un fichier. L'option +x ajoute la permission d'exécution, vous permettant ainsi de lancer le script.

Exécution du script avec des arguments

Maintenant que notre script est prêt, exécutons-le avec différents arguments pour observer le comportement des variables spéciales.

  1. Lancez le script sans aucun argument :
./special_vars.sh

Le préfixe ./ devant le nom du script indique au shell de chercher le fichier dans le répertoire courant.

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

Script Name: ./special_vars.sh
First Argument:
Second Argument:
All Arguments:
Number of Arguments: 0
Process ID: 1234

Remarquez que les premier et deuxième arguments sont vides, et que le nombre d'arguments est 0 puisque nous n'en avons fourni aucun.

  1. Maintenant, lancez le script avec quelques arguments :
./special_vars.sh hello world

Le résultat devrait ressembler à ceci :

Script Name: ./special_vars.sh
First Argument: hello
Second Argument: world
All Arguments: hello world
Number of Arguments: 2
Process ID: 1235

Voici ce qui a changé :

  • $1 contient désormais "hello"
  • $2 contient désormais "world"
  • $@ affiche tous les arguments : "hello world"
  • $# affiche 2, car nous avons fourni deux arguments

L'identifiant de processus ($$) sera probablement différent à chaque exécution, car il est attribué dynamiquement par le système d'exploitation.

Comprendre $? et $!

Deux autres variables spéciales essentielles sont $? et $!. Créons un nouveau script pour illustrer leur utilité.

  1. Créez un nouveau fichier nommé exit_status.sh :
touch ~/project/exit_status.sh
  1. Ouvrez le fichier dans l'éditeur et ajoutez le contenu suivant :
#!/bin/bash

echo "Running a successful command:"
ls /home
echo "Exit status: $?"

echo "Running a command that will fail:"
ls /nonexistent_directory
echo "Exit status: $?"

echo "Running a background process:"
sleep 2 &
echo "Process ID of last background command: $!"

Analysons ce script :

  • $? donne le code de retour (exit status) de la dernière commande exécutée. La valeur 0 signifie généralement un succès, tandis qu'une valeur différente de zéro indique diverses conditions d'erreur.
  • $! donne l'identifiant de processus (PID) de la dernière commande lancée en arrière-plan.
  • Le symbole & à la fin d'une commande permet de l'exécuter en arrière-plan.
  1. Enregistrez le fichier et rendez-le exécutable :
chmod +x ~/project/exit_status.sh
  1. Exécutez le script :
./exit_status.sh

Vous devriez voir un résultat de ce type :

Running a successful command:
labex
Exit status: 0
Running a command that will fail:
ls: cannot access '/nonexistent_directory': No such file or directory
Exit status: 2
Running a background process:
Process ID of last background command: 1236

Observations :

  • La première commande ls réussit, donc $? vaut 0.
  • La deuxième commande ls échoue (car le répertoire n'existe pas), donc $? vaut 2 (une valeur non nulle indiquant une erreur).
  • La commande sleep s'exécute en arrière-plan, et $! nous donne son PID.

Utilisation des variables spéciales dans les fonctions

Les variables spéciales peuvent également être utilisées à l'intérieur des fonctions. Créons un script pour le démontrer.

  1. Créez un nouveau fichier nommé function_vars.sh :
touch ~/project/function_vars.sh
  1. Ouvrez le fichier dans l'éditeur et insérez le code suivant :
#!/bin/bash

function print_args {
  echo "Function Name: $0"
  echo "First Argument: $1"
  echo "Second Argument: $2"
  echo "All Arguments: $@"
  echo "Number of Arguments: $#"
}

echo "Calling function with two arguments:"
print_args hello world

echo "Calling function with four arguments:"
print_args one two three four

Ce script définit une fonction print_args qui utilise des variables spéciales. Il appelle ensuite cette fonction deux fois avec un nombre d'arguments différent.

  1. Enregistrez le fichier et rendez-le exécutable :
chmod +x ~/project/function_vars.sh
  1. Exécutez le script :
./function_vars.sh

Le résultat devrait être le suivant :

Calling function with two arguments:
Function Name: ./function_vars.sh
First Argument: hello
Second Argument: world
All Arguments: hello world
Number of Arguments: 2
Calling function with four arguments:
Function Name: ./function_vars.sh
First Argument: one
Second Argument: two
All Arguments: one two three four
Number of Arguments: 4

Notez que :

  • $0 fait toujours référence au nom du script, et non au nom de la fonction.
  • $1, $2, $@ et $# fonctionnent pour les arguments de la fonction exactement comme ils le font pour les arguments du script.
  • Les valeurs de ces variables changent à chaque fois que la fonction est appelée avec des arguments différents.

Comprendre la différence entre $@ et $*

Les variables spéciales $@ et $* servent toutes deux à représenter l'ensemble des arguments de la ligne de commande, mais elles se comportent différemment lorsqu'elles sont entourées de guillemets doubles. Créons un script pour mettre en évidence cette différence.

  1. Créez un nouveau fichier nommé at_vs_star.sh :
touch ~/project/at_vs_star.sh
  1. Ouvrez le fichier dans l'éditeur et ajoutez le contenu suivant :
#!/bin/bash

echo "Using \$@:"
for arg in "$@"; do
  echo "Argument: $arg"
done

echo "Using \$*:"
for arg in "$*"; do
  echo "Argument: $arg"
done

Ce script illustre la différence entre $@ et $* lorsqu'ils sont utilisés dans une boucle.

  1. Enregistrez le fichier et rendez-le exécutable :
chmod +x ~/project/at_vs_star.sh
  1. Exécutez le script avec plusieurs arguments, dont certains contenant des espaces :
./at_vs_star.sh "arg with spaces" another_arg "third arg"

Vous devriez obtenir ce résultat :

Using $@:
Argument: arg with spaces
Argument: another_arg
Argument: third arg
Using $*:
Argument: arg with spaces another_arg third arg

Voici l'explication :

  • Avec "$@", chaque argument est traité comme une entité distincte. Les arguments contenant des espaces sont préservés en tant qu'unités individuelles.
  • Avec "$*", tous les arguments sont combinés en une seule chaîne de caractères, séparés par le premier caractère de la variable IFS (Internal Field Separator), qui est généralement un espace.

Cette distinction est cruciale lorsque vous devez traiter des arguments susceptibles de contenir des espaces ou d'autres caractères spéciaux.

Résumé

Dans cet atelier, vous avez découvert les variables spéciales de la programmation shell et appris à les utiliser efficacement. Vous avez créé des scripts illustrant l'usage de diverses variables telles que $0, $1, $@, $#, $$, $? et $!. Vous avez également exploré le comportement de ces variables dans différents contextes, notamment au sein de fonctions et lors de la manipulation d'arguments complexes.

Points clés à retenir :

  1. $0, $1, $2, etc., représentent le nom du script et les arguments de la ligne de commande.
  2. $@ et $# permettent de manipuler l'ensemble des arguments et de les compter.
  3. $$ vous donne le PID du processus actuel, ce qui est utile pour créer des fichiers temporaires uniques.
  4. $? permet de vérifier si la commande précédente s'est exécutée avec succès.
  5. $! fournit le PID du dernier processus lancé en arrière-plan, utile pour le contrôle des tâches.
  6. $@ et $* se comportent différemment lorsqu'ils sont entre guillemets, ce qui est primordial pour gérer les arguments contenant des espaces.

La compréhension de ces variables spéciales est indispensable pour écrire des scripts shell avancés et flexibles. Elles permettent de concevoir des outils capables de s'adapter à diverses entrées et fournissent des informations précieuses sur l'environnement d'exécution.

Au fur et à mesure de votre pratique, vous trouverez de nombreuses autres façons de tirer parti de ces variables. N'hésitez pas à consulter le manuel de bash (man bash) pour obtenir des informations plus détaillées sur ces variables et bien d'autres.