Retour au cours

tableaux

Objectifs

  • Créer et initialiser des tableaux (arrays) pour stocker des listes de valeurs.
  • Accéder à des éléments spécifiques par leur index.
  • Itérer proprement sur tous les éléments d’un tableau.
  • Ajouter, modifier et supprimer des éléments.
  • Comprendre la différence cruciale entre ${tableau[@]} et ${tableau[*]}.

Explications détaillées

Notions clés

Un tableau est une variable capable de contenir plusieurs valeurs distinctes. C’est la structure de données fondamentale en Bash pour gérer des collections d’éléments, comme une liste de fichiers ou de serveurs. Les tableaux standards sont “indexés”, ce qui signifie que chaque élément est repéré par un numéro (son index), en commençant par 0.

Déclaration d’un tableau

La manière la plus simple est d’utiliser des parenthèses avec les éléments séparés par des espaces.

noms=("Alice" "Bob" "Charlie" "David le Grand")

Vous pouvez aussi le déclarer explicitement avec declare -a.

declare -a serveurs

Accéder aux éléments

L’accès se fait avec la syntaxe ${NOM_TABLEAU[index]}. Les accolades sont obligatoires.

  • ${noms[0]} : Premier élément (Alice).
  • ${noms[1]} : Deuxième élément (Bob).
  • ${noms[-1]} : Dernier élément (syntaxe moderne de Bash).

Accéder à tous les éléments : ${@} vs ${*}

C’est la même distinction que pour les paramètres positionnels.

  • "${noms[@]}" : Se développe en une liste de mots distincts. Chaque élément du tableau est traité comme une chaîne séparée, même s’il contient des espaces. C’est la forme à utiliser dans 99% des cas.
  • "${noms[*]}" : Se développe en une seule chaîne de caractères, avec tous les éléments joints par le premier caractère de IFS.

Informations sur le tableau

  • ${#noms[@]} : Donne le nombre d’éléments dans le tableau.
  • ${!noms[@]} : Donne la liste des index (utile si le tableau a des “trous”).

Modifier un tableau

  • noms[2]="Chloé" : Modifie l’élément à l’index 2.
  • noms+=( "David" ) : Ajoute un ou plusieurs éléments à la fin du tableau. C’est la méthode propre.
  • unset noms[1] : Supprime l’élément à l’index 1. Attention, cela crée un “trou” dans les indices, ce qui peut être surprenant.

Syntaxe / Usages

# Déclaration
fichiers=("rapport.txt" "notes.md" "image finale.jpg")

# Accès
echo "Le premier fichier est : ${fichiers[0]}"

# Nombre d'éléments
echo "Il y a ${#fichiers[@]} fichiers."

# Itération propre
for f in "${fichiers[@]}"; do
  echo "Traitement de : '$f'"
done

# Ajout d'un élément
fichiers+=("archive.zip")

# Afficher tout le tableau pour déboguer
declare -p fichiers

Exemples

# 1. Utiliser un tableau pour stocker une liste de serveurs à tester
serveurs=("google.com" "github.com" "serveur.inexistant")

echo "--- Test des serveurs ---"
for srv in "${serveurs[@]}"; do
  if ping -c 1 "$srv" &> /dev/null; then
    echo "✅ $srv est en ligne."
  else
    echo "❌ $srv est injoignable."
  fi
done

# 2. Stocker les arguments du script dans un tableau
# Cela permet de les manipuler plus facilement
arguments=("$@")
echo "Le deuxième argument passé au script était : ${arguments[1]}"

Bonnes pratiques

  • La règle d’or : toujours utiliser "${mon_tableau[@]}" (avec les accolades, les guillemets et @) pour développer les éléments. C’est la seule façon de garantir que les éléments contenant des espaces seront traités correctement.
  • Utilisez les tableaux dès que vous avez besoin de gérer une collection d’éléments. C’est beaucoup plus robuste qu’une simple chaîne de caractères avec des séparateurs.
  • Pour ajouter des éléments, privilégiez la syntaxe ma_liste+=( "nouvel item" ).

Pièges courants

  • Oublier les accolades : echo $noms[0] ne fonctionnera pas comme attendu. Le shell essaiera de trouver un fichier nommé 0 et d’y attacher $noms. Il faut impérativement echo ${noms[0]}.
  • Utiliser @ ou * sans guillemets : for f in ${fichiers[@]} cassera les noms de fichiers contenant des espaces. for f in "${fichiers[@]}" fonctionnera.
  • La suppression avec unset : unset mon_tableau[1] ne décale pas les indices. Si votre tableau était (a b c), il devient un tableau avec des éléments aux indices 0 et 2, mais rien à l’indice 1. Cela peut surprendre.

Exercices

  1. Liste de courses :

    • Créez un tableau contenant lait, pain, beurre.
    • Affichez le premier et le dernier élément.
    • Ajoutez œufs à la fin de la liste.
    • Affichez le nombre total d’articles et la liste complète, un article par ligne.
  2. Parcourir les arguments :

    • Écrivez un script qui prend plusieurs noms de fichiers en arguments.
    • Le script doit stocker ces arguments dans un tableau, puis itérer dessus pour afficher “Vérification de [nom_fichier]…” pour chaque fichier, seulement si le fichier existe (-f).
  3. Tableau de nombres :

    • Créez un tableau contenant les nombres de 1 à 5.
    • Utilisez une boucle for pour calculer et afficher la somme de tous les éléments du tableau.