Hachages ou tableaux associatifs en BASH

Depuis les versions supérieures à 4 de BASH, vous pouvez utiliser les tables de hachage ou tableaux associatifs dans vos scripts BASH en plus des tableaux indexés. Pour rappel, un hachage est un tableau dont les indexes sont des chaînes de caractères.

Déclaration d’un hachage ou tableau associatif

Le tableau DOIT être déclaré comme hachage via l’option « -A » (« A » majuscule est non « a » minuscule comme pour les tableaux indexés).:

declare -A ARRAY

Initialisation

Le tableau peut être initialisé directement :

ARRAY=(["F"]="nouveau" ["G"]="test") ;

ou élément par élément :

ARRAY["A"]=15 ;
ARRAY["C"]="Chaine de caractères" ;
ARRAY["B"]=10 ;
ARRAY["FHH"]='c' ;

Accès aux éléments

Les différents modes d’accès aux éléments des tableaux sont ensuite les mêmes que pour un tableau indexé :

echo "Hashage \"A\" : "${ARRAY["A"]} ; # Affiche Hashage "A" : 15
echo "Hashage \"FHH\" : "${ARRAY["FHH"]} ; # Affiche Hashage "FHH" : c

Informations sur le tableau

Le nombre d’élément du hachage est obtenu de la même manière que pour les tableaux indexés :

echo "Nombre d'éléments : "${#ARRAY[*]} ; # ou ${#ARRAY[@]}

enfin les indexes sont retourné par « ${!ARRAY[@]} » ou « ${!ARRAY[*]} » :

echo "Indexes du hachage : "${!ARRAY[@]} ; # idem ${!ARRAY[*]} sortie dans l'ordre croissant

Parcours d’un hachage

Le parcours d’un hachage peut ressembler à :

for elem in ${!ARRAY[*]} ; do
        echo "Key \"${elem}\" : Value : "${ARRAY[${elem}]} ;
done

qui donne a l’exécution :

Key "A" : Value : 15
Key "B" : Value : 10
Key "C" : Value : Chaine de caractères
Key "FHH" : Value : c

Note sur l’ajout d’éléments

Attention à l’ajout d’informations qui doit être effectué élément par élément et non sous forme de liste sous peine de voir le tableau réinitialisé :

ARRAY=(["F"]="nouveau" ["G"]="test") ;
echo ${#ARRAY[*]} ; # retourne 2
echo ${!ARRAY[@]} ; # retourne F G

Libération/Suppression d’éléments

« unset » Permet de supprimer des éléments du hachage :

unset "ARRAY["F"]" ;

Note : Remarquez le positionnement des guillemets…

ou de supprimer tous le tableau :

unset ARRAY ;

Récapitulatif des tests

Voici un petit script résumant ces quelques tests :

#!/bin/bash
 
# Test SANS déclaration du tableau :
echo "* Test de hachage SANS déclaration préalable : "
ARRAY["A"]=1 ;
ARRAY["C"]="Chaine de caractères" ;
ARRAY["B"]=2 ;
 
echo "Hashage \"A\"                     : "${ARRAY["A"]} ; # retourne 2
echo "Hashage \"C\"                     : "${ARRAY["C"]} ; # retourne 2
echo "Taille du hashage         : "${#ARRAY[*]} ;               # idem ${#ARRAY[@]}
echo "Indexes du hachage                : "${!ARRAY[@]} ;       # idem ${!ARRAY[*]} sortie dans l'ordre alphabétique
unset ARRAY ;
echo "" ;
 
# Test AVEC déclaration du tableau :
echo "* Test de hachage AVEC déclaration préalable : "
# déclaration OBLIGATOIRE !
declare -A ARRAY
 
ARRAY["A"]=15 ;
ARRAY["C"]="Chaine de caractères" ;
ARRAY["B"]=10 ;
ARRAY["FHH"]='c' ;
 
echo "Hashage \"A\"                     : "${ARRAY["A"]} ; # retourne 15
echo "Hashage \"FHH\"                   : "${ARRAY["FHH"]} ; # retourne c
echo "Taille du hashage         : "${#ARRAY[*]} ;               # idem ${#ARRAY[@]}
echo "Indexes du hachage                : "${!ARRAY[@]} ;       # idem ${!ARRAY[*]} sortie dans l'ordre alphabétique
echo ""
 
echo "* Parcours d'un hachage : "
for elem in ${!ARRAY[*]} ; do
        echo "Key \"${elem}\" : Value : "${ARRAY[${elem}]} ; # retourne les clés du hachage et la valeur de leur élément
done
echo ""
 
# Essai d'ajout d'éléments au hachage :
echo "* Essai de la notation ARRAY=([\"F\"]=\"nouveau\" [\"G\"]=\"test\") ;" ;
# ATTENTION : 
ARRAY=(["F"]="nouveau" ["G"]="test") ;
echo "Nouvelle taille du hashage        : "${#ARRAY[*]} ; # retourne 2
echo "Nouveaux indexes du hachage       : "${!ARRAY[@]} ; # retourne F G
echo ""
 
echo "* Suppression de l'élément F : "
unset "ARRAY["F"]" ;
echo "Nouvelle taille du hashage        : "${#ARRAY[*]} ; # retourne 1
echo "Nouveaux indexes du hachage       : "${!ARRAY[@]} ; # retourne G
echo ""
 
echo "* Suppression du tableau : "
unset ARRAY 
echo ${ARRAY['G']} ; # rien

Conclusions

Seul regret, les tableaux sont unidimensionnels… Pas encore de tableaux de tableaux ou de hachage de tableaux…

6 réflexions au sujet de « Hachages ou tableaux associatifs en BASH »

  1. bonjour, et merci pour cette page.
    Pour l’enrichir je vous propose d’ajouter la fonction suivante à votre script d’exemple.

    Comme vous l’avez sans doute remarqué, la notation:
    ARRAY=(["H"]="nouveau" ["I"]="test") ;
    est foireuse: elle réaffecte totalement le hashage, donc supprime tout le contenu précédent:
    C’est un {remplacement} et non un {ajout}

    Pour ajouter des éléments au hachage, il faut faire:

    # Reussir des ajouts d'éléments au hashage:
    echo "Ajouts d'éléments au hashage:"
    echo "Pour ajouter 2 éléments F et G, la bonne notation est:"
    echo 'ARRAY["F"]="nouveau" '
    echo 'ARRAY["G"]="test" '
    ARRAY["F"]="nouveau"
    ARRAY["G"]="test" ;

    1. et pour copier une variable hachage dans une autre variable hashage:

      echo « Copie de:tableau_associatif sur HASHAGE: »
      declare -A HASHAGE
      # ceci ne marche pas pour les tableaux associatifs:
      #HASHAGE=(${tableau_associatif[*]})
      for elem in ${!tableau_associatif[*]} ; do
      echo « Clé: \ »${elem}\ » : Valeur : ${tableau_associatif[${elem}]} » ; # retourne les clés du hachage et la valeur de leur élément
      HACHAGE[${elem}]= »${tableau_associatif[${elem}]} »
      done

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *