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 deIFS.
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é0et d’y attacher$noms. Il faut impérativementecho ${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
-
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.
- Créez un tableau contenant
-
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).
-
Tableau de nombres :
- Créez un tableau contenant les nombres de 1 à 5.
- Utilisez une boucle
forpour calculer et afficher la somme de tous les éléments du tableau.