Bash : variables et expansions
Les variables stockent des valeurs réutilisables dans le script. Les exemples utilisent des noms génériques.
Déclarer et utiliser
Section intitulée « Déclarer et utiliser »nom="Alice" # aucun espace autour du =age=30echo "Nom : $nom, âge : $age"echo "Fichier : ${nom}_rapport.txt" # les accolades délimitent le nom de la variablePar convention, les variables de configuration s’écrivent en majuscules (DOSSIER_SAUVEGARDE) et les variables locales en minuscules.
readonly VERSION="1.0" # constante : ne peut plus être modifiéeexport LANG=fr_FR.UTF-8 # visible aussi par les programmes lancés depuis le scriptunset nom # supprime la variableGuillemets : la règle essentielle
Section intitulée « Guillemets : la règle essentielle »| É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) |
fichier="mon rapport.txt"rm $fichier # ERREUR : tente de supprimer « mon » puis « rapport.txt »rm "$fichier" # correctRésultat d’une commande
Section intitulée « Résultat d’une commande »date_du_jour="$(date +%F)" # 2026-10-05nb_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.
Valeurs par défaut et variables obligatoires
Section intitulée « Valeurs par défaut et variables obligatoires »dossier="${1:-/tmp}" # valeur par défaut si $1 est vide ou absentdossier="${DOSSIER:=/tmp}" # idem, et affecte la valeurcible="${2:?Usage: $0 source cible}" # arrête le script avec un message si $2 est absentManipuler les chaînes
Section intitulée « Manipuler les chaînes »fichier="/var/log/syslog.1.gz"echo "${#fichier}" # longueur : 20echo "${fichier##*/}" # nom du fichier : syslog.1.gzecho "${fichier%/*}" # dossier : /var/logecho "${fichier%.gz}" # retire l'extension : /var/log/syslog.1echo "${fichier/log/journal}" # remplace la 1re occurrenceecho "${fichier//log/journal}" # remplace toutes les occurrencesecho "${nom^^}" # majusculesecho "${nom,,}" # minusculesAide-mémoire : # retire un préfixe, % retire un suffixe (doublé : le plus long motif).
a=7b=3echo $(( a + b )) # 10echo $(( a * b )) # 21echo $(( a % b )) # 1 (reste)(( a++ )) # incrémentetotal=$(( 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.
Tableaux
Section intitulée « Tableaux »fruits=("pomme" "poire" "cerise")echo "${fruits[0]}" # pommeecho "${fruits[@]}" # tous les élémentsecho "${#fruits[@]}" # nombre d'éléments : 3fruits+=("fraise") # ajoute un élément
for f in "${fruits[@]}"; do # parcourir (guillemets conservés) echo "- $f"doneTableaux associatifs (clé → valeur)
Section intitulée « Tableaux associatifs (clé → valeur) »declare -A ports=( [http]=80 [https]=443 [ssh]=22 )echo "${ports[ssh]}" # 22ports[dns]=53
for service in "${!ports[@]}"; do # les clés echo "$service : ${ports[$service]}"doneVariables d’environnement utiles
Section intitulée « Variables d’environnement utiles »| 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) |
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Manuel : Shell Parameter Expansion