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"
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
| Écriture | Comportement |
|---|---|
"$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)
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"
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
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
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
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
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.