Aller au contenu

Bash : variables et expansions

Les variables stockent des valeurs réutilisables dans le script. Les exemples utilisent des noms génériques.

Fenêtre de terminal
nom="Alice" # aucun espace autour du =
age=30
echo "Nom : $nom, âge : $age"
echo "Fichier : ${nom}_rapport.txt" # les accolades délimitent le nom de la variable

Par convention, les variables de configuration s’écrivent en majuscules (DOSSIER_SAUVEGARDE) et les variables locales en minuscules.

Fenêtre de terminal
readonly VERSION="1.0" # constante : ne peut plus être modifiée
export LANG=fr_FR.UTF-8 # visible aussi par les programmes lancés depuis le script
unset nom # supprime la variable
Écriture Effet
"$nom" Guillemets doubles : la variable est remplacée, les espaces sont préservés
'$nom' Guillemets simples : texte littéral, rien n’est remplacé
$nom Sans guillemets : le contenu est découpé aux espaces (source d’erreurs)
Fenêtre de terminal
fichier="mon rapport.txt"
rm $fichier # ERREUR : tente de supprimer « mon » puis « rapport.txt »
rm "$fichier" # correct
Fenêtre de terminal
date_du_jour="$(date +%F)" # 2026-10-05
nb_lignes="$(wc -l < /etc/passwd)"
echo "Aujourd'hui : $date_du_jour, $nb_lignes utilisateurs"

$(commande) est la forme à utiliser ; l’ancienne forme avec accents graves (`commande`) est déconseillée.

Fenêtre de terminal
dossier="${1:-/tmp}" # valeur par défaut si $1 est vide ou absent
dossier="${DOSSIER:=/tmp}" # idem, et affecte la valeur
cible="${2:?Usage: $0 source cible}" # arrête le script avec un message si $2 est absent
Fenêtre de terminal
fichier="/var/log/syslog.1.gz"
echo "${#fichier}" # longueur : 20
echo "${fichier##*/}" # nom du fichier : syslog.1.gz
echo "${fichier%/*}" # dossier : /var/log
echo "${fichier%.gz}" # retire l'extension : /var/log/syslog.1
echo "${fichier/log/journal}" # remplace la 1re occurrence
echo "${fichier//log/journal}" # remplace toutes les occurrences
echo "${nom^^}" # majuscules
echo "${nom,,}" # minuscules

Aide-mémoire : # retire un préfixe, % retire un suffixe (doublé : le plus long motif).

Fenêtre de terminal
a=7
b=3
echo $(( a + b )) # 10
echo $(( a * b )) # 21
echo $(( a % b )) # 1 (reste)
(( a++ )) # incrémente
total=$(( a * 2 ))

L’arithmétique de Bash ne traite que des nombres entiers. Pour les décimaux : awk 'BEGIN { print 7 / 3 }' ou bc -l.

Fenêtre de terminal
fruits=("pomme" "poire" "cerise")
echo "${fruits[0]}" # pomme
echo "${fruits[@]}" # tous les éléments
echo "${#fruits[@]}" # nombre d'éléments : 3
fruits+=("fraise") # ajoute un élément
for f in "${fruits[@]}"; do # parcourir (guillemets conservés)
echo "- $f"
done
Fenêtre de terminal
declare -A ports=( [http]=80 [https]=443 [ssh]=22 )
echo "${ports[ssh]}" # 22
ports[dns]=53
for service in "${!ports[@]}"; do # les clés
echo "$service : ${ports[$service]}"
done
Variable Contenu
$HOME Dossier personnel
$USER Nom de l’utilisateur
$PWD Dossier courant
$PATH Dossiers où sont cherchées les commandes
$HOSTNAME Nom de la machine
$RANDOM Nombre aléatoire entre 0 et 32767
$EUID Identifiant effectif de l’utilisateur (0 = root)