12.2. Tableaux associatifs

12.2.1. Définition et initialisation

Dans un tableau associatif, les index permettant d’accéder aux éléments du tableau ne sont plus des entiers positifs ou nuls mais des chaînes de caractères appelées clés.

  • Pour créer un ou plusieurs tableau associatifs vides, on utilise la syntaxe : declare -A nomtabA ...

  • Pour définir et initialiser un tableau associatif, il est possible d’utiliser les syntaxes suivantes :

         declare -A nomtabA=( [clé]=val ... )

    ou bien

         declare -A nomtabA

         nomtabA=( [clé]=val ... )

    Contrairement aux tableaux classiques, l’utilisation de la syntaxe declare -A est impérative pour créer un tableau associatif.

    $ declare -A tabCapA=( [fr]=Paris  [it]=Rome )
    $ 
    $ declare -A tabMonA
    $ tabMonA=( [France]=euro  ["Etats Unis"]="dollar US" )
    $
  • Pour lister les tableaux associatifs définis : declare -A

    $ declare -A
    declare -A BASH_ALIASES='()'
    declare -A BASH_CMDS='()'
    declare -A tabCapA='([fr]="Paris" [it]="Rome" )'
    declare -A tabMonA='([France]="euro" ["Etats Unis"]="dollar US" )'
    $
  • Pour désigner un élément d'un tableau associatif : nomtabA[clé]

    $ declare -A tailleA
    $ read tailleA[Pierre] tailleA[Jean]
    1,83 1,72
    $
  • Pour créer un tableau associatif en lecture seule, on utilise les options -rA :

    $ declare -rA tconstA=( [Aline]=22  [Marie]=43 )   => tableau en lecture seule
    $ 
    $ tconstA[Aline]=23		=> modification d’une valeur
    bash: tconstA : variable en lecture seule
    $ 
    $ tconstA[Julie]=34		=> ajout d’un élément
    bash: tconstA : variable en lecture seule
    $
  • Pour afficher les valeurs et attributs d’un tableau associatif, on utilise la syntaxe usuelle : declare –p nomtabA …

    $ declare –p tailleA
    declare -A tailleA='([Jean]="1,72" [Pierre]="1,83" )'
    $

12.2.2. Opérations sur un élément de tableau associatif

  • Valeur d'un élément :

    Pour obtenir la valeur d'un élément d'un tableau associatif, on utilise la syntaxe : ${nomtab[clé]}

    $ echo ${tailleA[Jean]}
    1,72
    $
  • Longueur d'un élément :

    Pour obtenir la longueur d'un élément d'un tableau associatif : ${#nomtab[clé]}

    $ echo ${#tailleA[Pierre]}
    4		=> longueur de la chaîne 1,83
    $
  • Suppression d’un élément :

    Suppression d'un ou plusieurs éléments d'un tableau associatif : unset nomtabA[clé] ...

  • Autres opérations :

    Les traitements sur les éléments d’un tableau classique sont également applicables aux éléments d’un tableau associatif.

    $ declare -A tPaysA=([France]="Paris:euro:fr" ["Etats Unis"]="Washington, D.C.:dollar US:us")
    $ 
    $ echo ${tPaysA["Etats Unis"]/dollar US/USD}
    Washington, D.C.:USD:us
    $

12.2.3. Opérations sur un tableau associatif

  • Nombre d’éléments d’un tableau associatif : ${#nomtabA[@]}

    Pour obtenir le nombre d'éléments du tableau associatif nomtabA, on utilisera la même syntaxe que pour les tableaux classiques : ${#nomtabA[@]}

    $ declare -A tabPersA=([Pierre]="Canson Bonnefoy:1,73:20" ["Jean Michel"]="Dupont:1,72:18")
    $
    $ echo ${#tabPersA[@]}
    2
    $
  • Accès à tous les éléments d’un tableau associatif : "${nomtabA[@]}"

    Pour lister toutes les valeurs d’un tableau associatif, on utilise la même syntaxe que pour les tableaux classiques : "${nomtabA[@]}"

    $ for p in "${tabPersA[@]}"
    > do
    >   echo $p
    > done
    Canson Bonnefoy:1,73:20		=> l’intégrité de la valeur de l’élément est préservée
    Dupont:1,72:18
    $
  • Liste de toutes les clés définies : "${!nomtabA[@]}"

    Il est déconseillé d’utiliser la syntaxe ${!nomtabA[@]} pour lister toutes les clés d’un tableau associatif, car les éléments sont accédés via des clés qui sont elles même des chaînes de caractères pouvant être composées de plusieurs mots.

    $ for cl in ${!tabPersA[@]}
    > do
    >   echo "$cl => ${tabPersA[$cl]}"
    > done
    Pierre => Canson Bonnefoy:1,73:20
    Jean => 			=> l’intégrité de la clé n’a pas été préservée
    Michel => 
    $

    Par conséquent, pour lister toutes les clés d’un tableau associatif, on préfèrera utiliser la syntaxe : "${!nomtabA[@]}"

    $ for cl in "${!tabPersA[@]}"
    > do
    >   echo "$cl => ${tabPersA[$cl]}"	 
    > done				
    Pierre => Canson Bonnefoy:1,73:20
    Jean Michel => Dupont:1,72:18		=> l’intégrité de la clé est préservée
    $
    • Remarque : contrairement aux tableaux classiques, la syntaxe ${tabPersA[cl]} ne peut être utilisée pour un tableau associatif car cl est une chaîne de caractères. Seule la notation ${tabPersA[$cl]} doit être employée.

  • Ajout d’éléments à un tableau associatif

    Les notions de début ou de fin d’un tableau associatif ne sont pas pertinentes. De même, il ne peut y avoir de « trous » dans un tableau associatif : aucune relation d’ordre n’est définie sur les éléments d’un tableau associatif.

    Pour ajouter un ou plusieurs éléments à un tableau associatif tabA, on peut utiliser la syntaxe : tabA+=( [cle]=val … )

    $ declare -A tabCapA=( [fr]=Paris  [it]=Rome )
    $ 
    $ tabCapA+=(  [es]=Madrid  [de]=Berlin)
    $
  • Copie d’un tableau associatif

    Pour copier un tableau associatif tabA dans un autre cpA, la méthode la plus simple consiste à copier itérativement élément par élément.

    $ declare -A tabA=( [jean louis]="dupond latour"  [yves andre michel]="de la rosette")
    $ 
    $ declare -A cpA			=> création du nouveau tableau associatif cpA
    $ for cl in "${!tabA[@]}"
    > do
    >   cpA+=( [$cl]="${tabA[$cl]}" )		=> ajout dans le nouveau tableau 
    > done
    $ 
    $ declare -p tabA cpA		=> affichage
    declare -A tabA='(["jean louis"]="dupond latour" ["yves andre michel"]="de la rosette" )'
    declare -A cpA='(["jean louis"]="dupond latour" ["yves andre michel"]="de la rosette" )'
    $
  • Suppression d’un tableau associatif

    Pour supprimer un ou plusieurs tableaux associatifs : unset nomtabA ...