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 lister les tableaux associatifs définis : declare -A

    $ declare -A
    declare -A BASH_ALIASES=()
    declare -A BASH_CMDS=()
    declare -A _xspecs=([tex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" 
         . . .		 
    $
    
  • Pour créer un ou plusieurs tableau associatifs vides : declare -A nomtabA ...

  • Plusieurs syntaxes sont utilisables pour définir et initialiser globalement un tableau associatif :


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

      $ declare -A tabCap1A=( [fr]=Paris  [it]=Rome )
      $
      $ declare -A tabCap2A
      $ tabCap2A=( [fr]=Paris  [it]=Rome )
      $
      

    • declare -A nomtabA=( clé1  val1 ... )
           ou bien
      declare -A nomtabA
      nomtabA=( clé1  val1 ... )
                                                      

      $ declare -A tabMon1A=(France euro "Etats Unis" "dollar US" )
      $ 
      $ declare -A tabMon2A
      $ tabMon2A=(France  euro "Etats Unis" "dollar US" )
      $	
      

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

    $ tabTailleA=( [Pierre]=1,83  [Jean]=1,72 )   => declare -A tabTailleA absent !
    $
    $ declare -A
    declare -A BASH_ALIASES=()
    declare -A BASH_CMDS=()
    declare -A _xspecs=([tex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" 
    	. . .
    declare -A tabCap1A=([it]="Rome" [fr]="Paris" ) 
    declare -A tabCap2A=([it]="Rome" [fr]="Paris" ) 
    declare -A tabMon1A=([France]="euro" ["Etats Unis"]="dollar US" ) 
    declare -A tabMon2A=([France]="euro" ["Etats Unis"]="dollar US" ) 
    $	=> absence du tableau tabTailleA !
    $ 
    $ declare –a
    declare -a BASH_ARGC=([0]="0") 
    		. . .	
    declare -a PIPESTATUS=([0]="0")
    declare -a tabTailleA=([0]="1,72") => le type de tabTailleA a été mal 
    $		 		   => 	interprété
    
  • 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
    $
    

    Remarque : lorsque la valeur de la clé est contenue dans une variable cl (ex : cl=Jean), il est impératif d’utiliser la syntaxe ${nomtab[$clé]}

    $ cl=Jean 
    $  
    $ echo ${tailleA[$cl]} 
    1,72 
    $  
    $ echo ${tailleA[cl]} 	
    	=> cl a été interprétée comme la chaine "cl" et non la variable cl
    $	=>	il en résulte que l’élément n’a pas été trouvé
    
  • 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 chaînes de caractères (modificateurs de chaines, extraction/remplacement d’une sous-chaine, transformation majuscules/minuscules [cf. Chapitre 9, Chaînes de caractères § 3, 4, 5, 6]) 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")
    $ 
    $ i="France" 
    $  
    $ echo ${tPaysA[$i]#*:} 
    euro:fr 
    $  
    $ j="Etats Unis" 
    $  
    $ echo ${tPaysA[$j]%%:*} 
    Washington, D.C. 
    $  
    $ echo ${tPaysA[$j]:0:10} 
    Washington 
    $  
    $ echo ${tPaysA[$i]: -2:2}   		=>  caractère espace entre : et -2 
    fr 
    $
    $ echo ${tPaysA[$i]/fr/FR} 
    Paris:euro:FR 
    $  
    $ echo ${tPaysA[$j]^^} 
    WASHINGTON, D.C.:DOLLAR US: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 à toutes les valeurs 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
    Dupont:1,72:18
    Canson Bonnefoy:1,73:20		=> l’intégrité de la valeur de l’élément est préservée
    $
    
  • 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
    Jean => 			=> l’intégrité de la clé n’a pas été préservée
    Michel => 
    Pierre => Canson Bonnefoy:1,73:20
    $
    

    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				
    Jean Michel => Dupont:1,72:18		=> l’intégrité de la clé est préservée
    Pierre => Canson Bonnefoy:1,73:20
    $
    
  • 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)
    $
    $ declare -p tabCapA 
    declare -A tabCapA=([it]="Rome" [de]="Berlin" [fr]="Paris" [es]="Madrid" )
    $
    
  • Copie d’un tableau associatif

    Pour copier un tableau associatif tabA dans un autre tableau associatif 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" )'
    $
    
  • Traitement uniforme des éléments d’un tableau associatif

    Les modificateurs de chaines, le remplacement d’une sous-chaine et la transformation majuscules/minuscules [cf. Chapitre 9, Chaînes de caractères § 3, 5, 6] sont également applicables en une seule passe à l’ensemble des éléments d’un tableau associatif.

    $ declare -A tPaysA=([France]="Paris:euro:fr" ["Etats Unis"]="Washington, D.C.:dollar US:us")
    $  
    $ echo ${tPaysA[@]#*:} 
    euro:fr dollar US:us 
    $  
    $ echo ${tPaysA[@]%%:*} 
    Paris Washington, D.C. 
    $  
    $ echo ${tPaysA[@]//:/--}  
    Paris--euro--fr Washington, D.C.--dollar US--us 
    $  
    $ echo ${tPaysA[@]^^} 
    PARIS:EURO:FR WASHINGTON, D.C.:DOLLAR US:US 
    $
    
  • Suppression d’un tableau associatif

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