Aller au contenu principal

Les variables en Bash

Notions théoriques

Comme dans tout langage de programmation, une variable permet de stocker une information pour la réutiliser plus loin dans le script.

Déclarer une variable

nom_serveur="serveur-web-01"
attention

En Bash, il ne doit y avoir aucun espace autour du signe =. nom = "valeur" provoque une erreur, car Bash essaie alors d'exécuter une commande appelée nom avec des arguments = et "valeur".

Utiliser une variable

On accède au contenu d'une variable en faisant précéder son nom du symbole $ :

echo $nom_serveur
echo "Le serveur s'appelle $nom_serveur"

La syntaxe ${nom_serveur} (avec accolades) fonctionne aussi, et devient obligatoire quand le nom de la variable est collé à d'autres caractères, pour éviter toute ambiguïté :

fichier="rapport"
echo "${fichier}_2024.txt" # correct : rapport_2024.txt
echo "$fichier_2024.txt" # incorrect : Bash cherche une variable "fichier_2024" qui n'existe pas

Tout est chaîne de caractères

Contrairement à d'autres langages, Bash ne fait par défaut pas de différence entre nombre et texte : une variable contient toujours une chaîne de caractères, même si elle « ressemble » à un nombre.

Guillemets : simples, doubles, ou rien

ÉcritureComportement
"$variable"Les variables sont remplacées par leur valeur (recommandé, dans la grande majorité des cas)
'$variable'Rien n'est interprété : le texte reste tel quel
$variable (sans guillemets)Fonctionne, mais dangereux si la valeur contient des espaces
nom="Jean Dupont"
echo "Bonjour $nom" # Bonjour Jean Dupont
echo 'Bonjour $nom' # Bonjour $nom (aucun remplacement)
echo Bonjour $nom # Bonjour Jean Dupont, mais si $nom était utilisé comme argument
# d'une autre commande, il serait ici découpé en DEUX arguments

Nous approfondirons cette question du quoting en fin de niveau 1, mais retenez déjà ce réflexe : entourez systématiquement vos variables de guillemets doubles, sauf raison précise de ne pas le faire.

Substitution de commande

$(commande) exécute une commande et remplace l'expression par son résultat :

date_du_jour=$(date +%F)
nb_fichiers=$(ls /etc | wc -l)
info

Vous verrez parfois l'ancienne syntaxe avec des accents graves : `commande`. Elle fonctionne, mais $(commande) est préférée car plus lisible et plus facile à imbriquer.

Calculs entiers

Bash sait faire des calculs sur des nombres entiers avec la syntaxe $(( )) :

total=$(( 5 + 3 ))
echo "$total" # 8

Variables d'environnement

Certaines variables sont définies par le système et disponibles dans tous vos scripts, par exemple $HOME, $USER, $PWD ou $PATH (voir le cours Variables d'environnement). Une variable devient une variable d'environnement, transmise aux sous-processus, grâce à export.

Convention de nommage

Par convention :

  • les variables d'environnement système sont en MAJUSCULES ($HOME, $PATH),
  • les variables que vous créez dans vos scripts sont en minuscules (nom_serveur, date_du_jour),
  • les constantes du script sont généralement regroupées en haut du fichier, pour n'avoir qu'un seul endroit à modifier si une valeur change.

Exemple pratique

#!/bin/bash
# Script : rapport.sh
# Rôle : générer un rapport système avec un nom de fichier daté

# Constantes en haut du script
nom_serveur="serveur-etu"
dossier_rapport="/tmp"

# Variables calculées
date_du_jour=$(date +%F)
nb_fichiers_etc=$(ls /etc | wc -l)

# Construction du nom de fichier grâce aux accolades
nom_fichier="${dossier_rapport}/rapport_${nom_serveur}_${date_du_jour}.txt"

echo "Rapport généré le $date_du_jour pour $nom_serveur" > "$nom_fichier"
echo "Nombre de fichiers de configuration : $nb_fichiers_etc" >> "$nom_fichier"

echo "Rapport écrit dans : $nom_fichier"
astuce

Remarquez > pour créer (ou écraser) le fichier à la première écriture, puis >> pour ajouter à la suite — ces deux redirections ont déjà été vues dans le cours Linux.

Test de mémorisation/compréhension


Quelle affectation de variable est correcte en Bash ?


Après d=$(date +%F), que contient la variable d ?


Quelle est la différence entre echo '$USER' et echo "$USER" ?


Pourquoi écrire ${fichier}_2024.txt plutôt que $fichier_2024.txt ?


TP pour réfléchir et résoudre des problèmes

Nous allons créer rapport.sh, un script qui génère un rapport système dans un fichier nommé dynamiquement.

Étape 1 — Déclarer les constantes du script


Bonne pratique - Regrouper ses constantes

Placez toutes les constantes de votre script en haut du fichier. Si une valeur doit changer un jour (le nom du serveur, un chemin de dossier...), vous n'aurez qu'un seul endroit à modifier.

Étape 2 — Stocker la date du jour dans une variable


Bonne pratique - $() plutôt que les accents graves

Préférez toujours $(commande) aux anciens accents graves `commande` : c'est plus lisible, et surtout cela s'imbrique correctement quand vous avez besoin d'appeler une commande à l'intérieur d'une autre.

Étape 3 — Construire le nom du fichier et écrire le rapport


Bonne pratique - Toujours quoter les chemins de fichiers

Entourez systématiquement "$nom_fichier" de guillemets doubles dans les redirections. Si le chemin contient un espace, l'omission des guillemets peut faire échouer la commande ou, pire, agir sur le mauvais fichier.

📌 Une solution