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" ) $
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 $
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 ...