Retour au cours

assoc arrays

Objectifs

  • Créer un tableau associatif (l’équivalent d’un dictionnaire ou “hash map”) pour stocker des paires clé-valeur.
  • Accéder, modifier et ajouter des éléments en utilisant des chaînes de caractères comme clés.
  • Itérer sur les clés ou les valeurs d’un tableau associatif.
  • Comprendre quand utiliser un tableau associatif plutôt qu’un tableau indexé.

Explications détaillées

Notions clés

Alors que les tableaux standards utilisent des nombres comme indices (0, 1, 2, …), les tableaux associatifs utilisent des chaînes de caractères (des “clés”) pour stocker et retrouver des valeurs. C’est une structure de données extrêmement utile pour représenter des objets ou des configurations.

Important : C’est une fonctionnalité de Bash version 4 et supérieures.

Déclaration : declare -A

Avant de pouvoir utiliser un tableau associatif, vous devez le déclarer explicitement avec declare -A. C’est une étape obligatoire.

declare -A mon_dictionnaire

Initialisation et Accès

L’initialisation et l’accès se font avec une syntaxe similaire aux tableaux indexés, mais en utilisant des chaînes comme clés.

  • Initialisation : user=( [nom]="Alice" [role]="admin" [id]=123 )
  • Accès : echo ${user[nom]}Alice
  • Modification/Ajout : user[role]="editor"

Itération

Pour parcourir un tableau associatif, vous devez d’abord récupérer la liste de ses clés.

  • ${!user[@]} : Donne la liste de toutes les clés.
  • Une fois que vous avez les clés, vous pouvez itérer dessus avec une boucle for pour accéder aux valeurs correspondantes.

L’ordre dans lequel les clés sont retournées n’est pas garanti.

Syntaxe / Usages

# Déclaration obligatoire
declare -A config

# Remplissage
config[host]="localhost"
config[port]=5432
config[user]="postgres"

# Lecture
echo "Connexion à ${config[user]}@${config[host]}:${config[port]}"

# Itération sur les clés
echo "--- Configuration ---"
for cle in "${!config[@]}"; do
  echo "$cle = ${config[$cle]}"
done

# Afficher le nombre d'éléments
echo "Nombre de paramètres : ${#config[@]}"

# Supprimer un élément
unset config[port]

Exemples

# 1. Décrire un objet
declare -A voiture
voiture[marque]="Renault"
voiture[modele]="Clio"
voiture[annee]=2021
voiture[couleur]="bleu"

echo "Ma voiture est une ${voiture[marque]} ${voiture[modele]} de ${voiture[annee]}."

# 2. Compter les occurrences de mots dans une phrase
declare -A compte_mots
phrase="un deux deux trois trois trois"

for mot in $phrase; do
  # On incrémente le compteur pour ce mot
  ((compte_mots[$mot]++))
done

# Afficher les résultats
for mot in "${!compte_mots[@]}"; do
  echo "Le mot '$mot' apparaît ${compte_mots[$mot]} fois."
done

Bonnes pratiques

  • Toujours déclarer avec declare -A avant toute utilisation. C’est la source d’erreur la plus fréquente.
  • Utilisez les tableaux associatifs chaque fois que vous avez besoin de relier des libellés à des valeurs. C’est beaucoup plus lisible et maintenable que d’utiliser des variables séparées (USER_NOM, USER_ROLE, etc.).
  • Comme pour les tableaux indexés, citez toujours vos expansions ("${mon_tableau[$cle]}") pour gérer correctement les valeurs contenant des espaces.

Pièges courants

  • Oublier declare -A : Si vous oubliez la déclaration, Bash essaiera de traiter votre tableau comme un tableau indexé, ce qui donnera des résultats incorrects ou des erreurs. user[nom]="Alice" sera interprété comme user[0]="Alice".
  • Oublier les accolades pour l’accès : Il faut echo ${user[nom]}, pas echo $user[nom].
  • Portabilité : Les tableaux associatifs ne font pas partie du standard POSIX sh. Vos scripts ne fonctionneront qu’avec Bash (v4+). Si la portabilité est une exigence, vous ne pouvez pas les utiliser.

Exercices

  1. Profil utilisateur :

    • Créez un tableau associatif nommé profil pour vous décrire.
    • Ajoutez les clés prenom, ville et hobby_prefere.
    • Écrivez un script qui affiche une phrase de présentation en utilisant les valeurs de ce tableau.
  2. Configuration d’application :

    • Créez un tableau associatif app_config avec les clés env (valeur “production”), debug (valeur “false”), et api_url (valeur “https://api.exemple.com”).
    • Écrivez une boucle qui affiche toutes les paires clé/valeur de la configuration.
  3. Traducteur simple :

    • Créez un tableau associatif traductions qui mappe quelques mots du français vers l’anglais ([bonjour]="hello", [monde]="world").
    • Écrivez un script qui prend un mot en argument et affiche sa traduction s’il la connaît, ou “Traduction non trouvée” sinon.