Introduction
Ce tutoriel vous guidera à travers le processus de suppression d'éléments correspondants des tableaux Bash, une compétence fondamentale en programmation shell. Les tableaux vous permettent de stocker plusieurs valeurs dans une seule variable, ce qui les rend essentiels pour la gestion des collections de données dans vos scripts.
À la fin de ce tutoriel, vous comprendrez comment créer, manipuler et modifier efficacement les tableaux Bash, en mettant l'accent sur la suppression d'éléments spécifiques qui correspondent à certains critères. Ces compétences vous aideront à écrire des scripts Bash plus efficaces et plus puissants pour diverses tâches d'automatisation.
Création et utilisation des tableaux Bash
Avant d'apprendre à supprimer des éléments des tableaux, comprenons d'abord comment créer et utiliser les tableaux Bash.
Création de votre premier tableau
Ouvrez votre terminal dans l'environnement LabEx. Commençons par créer un simple tableau de fruits :
fruits=("apple" "banana" "cherry" "orange" "apple")
Cette commande crée un tableau nommé fruits contenant cinq éléments. Remarquez que "apple" apparaît deux fois - cela sera utile lorsque nous pratiquerons la suppression d'éléments correspondants plus tard.
Affichage des éléments du tableau
Pour afficher tous les éléments du tableau, utilisez :
echo "${fruits[@]}"
Vous devriez voir une sortie affichant tous les éléments :
apple banana cherry orange apple
Pour afficher un élément spécifique, vous pouvez spécifier son index (n'oubliez pas que les indices de tableau commencent à 0 dans Bash) :
echo "${fruits[0]}" ## Affiche le premier élément : apple
echo "${fruits[1]}" ## Affiche le deuxième élément : banana
Vérification de la longueur du tableau
Pour savoir combien d'éléments se trouvent dans votre tableau :
echo "${#fruits[@]}"
Cela devrait afficher 5, qui est le nombre total d'éléments dans notre tableau de fruits.
Ajout d'éléments à un tableau
Vous pouvez ajouter de nouveaux éléments à un tableau existant en utilisant l'opérateur += :
fruits+=("grape")
echo "${fruits[@]}"
La sortie devrait maintenant inclure "grape" à la fin :
apple banana cherry orange apple grape
Création d'un fichier de travail
Créons un fichier où nous allons pratiquer nos opérations sur les tableaux. Dans le WebIDE, créez un nouveau fichier nommé array_operations.sh dans le répertoire /home/labex/project en cliquant sur l'icône "New File" dans le panneau de l'explorateur de fichiers.
Ajoutez le code suivant au fichier :
#!/bin/bash
## Define our fruits array
fruits=("apple" "banana" "cherry" "orange" "apple" "grape")
## Display all elements
echo "All fruits in the array:"
echo "${fruits[@]}"
## Display the number of elements
echo "Number of fruits: ${#fruits[@]}"
## Display the first element
echo "First fruit: ${fruits[0]}"
Enregistrez le fichier (Ctrl+S ou en utilisant le menu) et rendez-le exécutable :
chmod +x /home/labex/project/array_operations.sh
Maintenant, exécutez votre script :
./array_operations.sh
Vous devriez voir une sortie affichant les éléments du tableau, le nombre et le premier élément :
All fruits in the array:
apple banana cherry orange apple grape
Number of fruits: 6
First fruit: apple
Félicitations ! Vous avez créé votre premier tableau Bash et effectué des opérations de base dessus. Dans les prochaines étapes, nous allons apprendre à supprimer des éléments spécifiques des tableaux.
Suppression d'éléments à l'aide d'une boucle for et de unset
Maintenant que vous comprenez les bases des tableaux Bash, explorons comment supprimer des éléments correspondants d'un tableau. Nous commencerons par la méthode la plus simple utilisant une boucle for et la commande unset.
Comprendre la commande unset
La commande unset dans Bash vous permet de supprimer des éléments d'un tableau en spécifiant leurs indices. Par exemple, pour supprimer le premier élément de notre tableau fruits :
unset fruits[0]
echo "${fruits[@]}"
L'exécution de ceci affichera :
banana cherry orange apple grape
Remarquez que le premier "apple" a été supprimé, mais les indices du tableau ne sont pas automatiquement réordonnés. Cela signifie qu'après avoir supprimé un élément, le tableau peut avoir des "trous" dans sa séquence d'indices.
Suppression d'éléments correspondants avec une boucle for
Créons un nouveau script pour supprimer toutes les occurrences de "apple" de notre tableau fruits. Dans le WebIDE, créez un nouveau fichier nommé remove_elements.sh dans le répertoire /home/labex/project :
#!/bin/bash
## Define our fruits array
fruits=("apple" "banana" "cherry" "orange" "apple" "grape")
echo "Original array: ${fruits[@]}"
## Loop through the array indices in reverse order
for ((i = ${#fruits[@]} - 1; i >= 0; i--)); do
if [ "${fruits[$i]}" == "apple" ]; then
unset "fruits[$i]"
fi
done
## Print the modified array
echo "Array after removing 'apple': ${fruits[@]}"
## Reindex the array to remove gaps (optional)
fruits=("${fruits[@]}")
echo "Array after reindexing: ${fruits[@]}"
Enregistrez le fichier et rendez-le exécutable :
chmod +x /home/labex/project/remove_elements.sh
Exécutez le script :
./remove_elements.sh
Vous devriez voir une sortie similaire à :
Original array: apple banana cherry orange apple grape
Array after removing 'apple': banana cherry orange grape
Array after reindexing: banana cherry orange grape
Comprendre le code
Examinons ce que fait notre script :
- Nous avons défini un tableau appelé
fruitsavec différents noms de fruits, y compris deux instances de "apple". - Nous avons parcouru les indices du tableau en ordre inverse (pour éviter les problèmes de décalage d'index lors de la suppression d'éléments).
- Pour chaque élément, nous avons vérifié s'il était égal à "apple" et l'avons supprimé si c'était le cas.
- Après avoir supprimé tous les éléments correspondants, nous avons réindexé le tableau pour éliminer tout écart dans la séquence d'indices.
Remarquez que nous avons parcouru le tableau en ordre inverse. Ceci est important lors de la suppression d'éléments car si nous supprimions des éléments tout en itérant vers l'avant, les indices des éléments restants seraient décalés, ce qui pourrait nous amener à sauter certains éléments.
Expérimenter avec différentes valeurs
Modifions notre script pour permettre la suppression de tout fruit spécifié par l'utilisateur. Modifiez le fichier remove_elements.sh pour qu'il ressemble à ceci :
#!/bin/bash
## Define our fruits array
fruits=("apple" "banana" "cherry" "orange" "apple" "grape")
## If no argument provided, default to removing "apple"
fruit_to_remove=${1:-"apple"}
echo "Original array: ${fruits[@]}"
echo "Removing: $fruit_to_remove"
## Loop through the array indices in reverse order
for ((i = ${#fruits[@]} - 1; i >= 0; i--)); do
if [ "${fruits[$i]}" == "$fruit_to_remove" ]; then
unset "fruits[$i]"
fi
done
## Print the modified array
echo "Array after removing '$fruit_to_remove': ${fruits[@]}"
## Reindex the array to remove gaps
fruits=("${fruits[@]}")
echo "Array after reindexing: ${fruits[@]}"
Enregistrez le fichier et exécutez-le avec différents arguments :
./remove_elements.sh banana
Vous devriez voir une sortie montrant que "banana" a été supprimé :
Original array: apple banana cherry orange apple grape
Removing: banana
Array after removing 'banana': apple cherry orange apple grape
Array after reindexing: apple cherry orange apple grape
Essayez avec d'autres noms de fruits dans notre tableau :
./remove_elements.sh orange
Excellent travail ! Vous avez appris à supprimer des éléments correspondants d'un tableau Bash en utilisant une boucle for et la commande unset. Dans la prochaine étape, nous explorerons d'autres méthodes pour supprimer des éléments des tableaux.
Méthodes alternatives pour la suppression d'éléments
Bien que la boucle for avec unset soit une approche courante pour supprimer des éléments des tableaux, Bash offre d'autres méthodes qui peuvent être plus concises ou efficaces dans certaines situations. Explorons deux approches alternatives.
Méthode 1 : Création d'un nouveau tableau avec des éléments filtrés
Au lieu de supprimer des éléments d'un tableau existant, nous pouvons créer un nouveau tableau qui inclut uniquement les éléments que nous souhaitons conserver. Cette approche évite d'avoir à réindexer le tableau après la suppression d'éléments.
Créez un nouveau fichier nommé filter_array.sh dans le répertoire /home/labex/project :
#!/bin/bash
## Define our fruits array
fruits=("apple" "banana" "cherry" "orange" "apple" "grape")
## If no argument provided, default to removing "apple"
fruit_to_remove=${1:-"apple"}
echo "Original array: ${fruits[@]}"
echo "Removing: $fruit_to_remove"
## Create a new array without the matching elements
declare -a filtered_fruits
for fruit in "${fruits[@]}"; do
if [ "$fruit" != "$fruit_to_remove" ]; then
filtered_fruits+=("$fruit")
fi
done
## Print the filtered array
echo "Array after removing '$fruit_to_remove': ${filtered_fruits[@]}"
Enregistrez le fichier et rendez-le exécutable :
chmod +x /home/labex/project/filter_array.sh
Exécutez le script :
./filter_array.sh
Vous devriez voir une sortie comme :
Original array: apple banana cherry orange apple grape
Removing: apple
Array after removing 'apple': banana cherry orange grape
Méthode 2 : Utilisation du modèle de remplacement de tableau
Bash fournit une syntaxe d'expansion de paramètre puissante qui peut être utilisée pour filtrer les tableaux. Implémentons cette méthode dans un nouveau script.
Créez un fichier nommé pattern_remove.sh dans le répertoire /home/labex/project :
#!/bin/bash
## Define our fruits array
fruits=("apple" "banana" "cherry" "orange" "apple" "grape")
## If no argument provided, default to removing "apple"
fruit_to_remove=${1:-"apple"}
echo "Original array: ${fruits[@]}"
echo "Removing: $fruit_to_remove"
## Create a temporary array to store valid indices
declare -a indices=()
for i in "${!fruits[@]}"; do
if [ "${fruits[$i]}" != "$fruit_to_remove" ]; then
indices+=("$i")
fi
done
## Create the filtered array using the valid indices
declare -a filtered_fruits=()
for i in "${indices[@]}"; do
filtered_fruits+=("${fruits[$i]}")
done
## Print the filtered array
echo "Array after removing '$fruit_to_remove': ${filtered_fruits[@]}"
Enregistrez le fichier et rendez-le exécutable :
chmod +x /home/labex/project/pattern_remove.sh
Exécutez le script :
./pattern_remove.sh grape
Vous devriez voir une sortie avec "grape" supprimé :
Original array: apple banana cherry orange apple grape
Removing: grape
Array after removing 'grape': apple banana cherry orange apple
Comparaison des méthodes
Créons un script récapitulatif qui compare les trois méthodes. Créez un fichier nommé compare_methods.sh dans le répertoire /home/labex/project :
#!/bin/bash
## Define our test array
fruits=("apple" "banana" "cherry" "orange" "apple" "grape")
fruit_to_remove=${1:-"apple"}
echo "Original array: ${fruits[@]}"
echo "Removing: $fruit_to_remove"
echo ""
## Method 1: Using for loop and unset
echo "Method 1: Using for loop and unset"
declare -a fruits_copy=("${fruits[@]}")
for ((i = ${#fruits_copy[@]} - 1; i >= 0; i--)); do
if [ "${fruits_copy[$i]}" == "$fruit_to_remove" ]; then
unset "fruits_copy[$i]"
fi
done
fruits_copy=("${fruits_copy[@]}")
echo "Result: ${fruits_copy[@]}"
echo ""
## Method 2: Creating a new filtered array
echo "Method 2: Creating a new filtered array"
declare -a filtered_fruits=()
for fruit in "${fruits[@]}"; do
if [ "$fruit" != "$fruit_to_remove" ]; then
filtered_fruits+=("$fruit")
fi
done
echo "Result: ${filtered_fruits[@]}"
echo ""
## Method 3: Using array indices
echo "Method 3: Using array indices"
declare -a indices_filtered=()
for i in "${!fruits[@]}"; do
if [ "${fruits[$i]}" != "$fruit_to_remove" ]; then
indices_filtered+=("${fruits[$i]}")
fi
done
echo "Result: ${indices_filtered[@]}"
Enregistrez le fichier et rendez-le exécutable :
chmod +x /home/labex/project/compare_methods.sh
Exécutez le script avec différents fruits à supprimer :
./compare_methods.sh banana
Vous devriez voir une comparaison des trois méthodes :
Original array: apple banana cherry orange apple grape
Removing: banana
Method 1: Using for loop and unset
Result: apple cherry orange apple grape
Method 2: Creating a new filtered array
Result: apple cherry orange apple grape
Method 3: Using array indices
Result: apple cherry orange apple grape
Les trois méthodes atteignent le même objectif, mais chacune a ses avantages :
- Méthode 1 (boucle for avec unset) modifie le tableau d'origine en place
- Méthode 2 (création d'un nouveau tableau) est souvent plus claire et évite les problèmes de décalage d'index
- Méthode 3 (utilisation des indices de tableau) peut être utile lorsque vous devez conserver le tableau d'origine
Choisissez la méthode qui correspond le mieux à votre cas d'utilisation spécifique et à votre style de codage.
Exercice pratique : Création d'un script de nettoyage de fichiers
Maintenant que vous comprenez les différentes méthodes de suppression d'éléments des tableaux Bash, appliquons ces connaissances à une situation pratique. Nous allons créer un script qui aide à nettoyer un répertoire en filtrant des types de fichiers spécifiques.
Le défi du nettoyage de fichiers
Imaginez que vous avez un répertoire contenant différents types de fichiers (fichiers texte, images, documents) et que vous souhaitez supprimer sélectivement certains types de fichiers. Nous utiliserons un tableau Bash pour gérer ces fichiers et appliquer nos connaissances en matière de filtrage de tableaux.
Étape 1 : Configuration d'un répertoire de test avec des exemples de fichiers
Tout d'abord, créons un répertoire de test avec quelques exemples de fichiers. Ouvrez votre terminal et exécutez :
mkdir -p /home/labex/project/test_files
cd /home/labex/project/test_files
## Create some sample files
touch file1.txt file2.txt document1.pdf document2.pdf image1.jpg image2.jpg script.sh config.yaml
Vérifiez que les fichiers ont été créés :
ls -la
Vous devriez voir la liste des exemples de fichiers que nous venons de créer.
Étape 2 : Création du script de nettoyage de fichiers
Créons maintenant notre script qui utilisera les opérations de tableau pour filtrer les fichiers. Créez un nouveau fichier nommé cleanup_files.sh dans le répertoire /home/labex/project :
#!/bin/bash
## Directory to scan
target_dir=${1:-"/home/labex/project/test_files"}
## File extension to filter out
extension_to_remove=${2:-"txt"}
echo "Scanning directory: $target_dir"
echo "Will remove files with extension: $extension_to_remove"
## Change to the target directory
cd "$target_dir" || {
echo "Directory not found!"
exit 1
}
## Get all files in the directory
all_files=(*)
echo "All files: ${all_files[@]}"
## Create an array to store files to keep
declare -a files_to_keep=()
## Filter out files with the specified extension
for file in "${all_files[@]}"; do
if [[ "$file" != *.$extension_to_remove ]]; then
files_to_keep+=("$file")
fi
done
echo "Files to keep: ${files_to_keep[@]}"
## Create an array of files to remove
declare -a files_to_remove=()
for file in "${all_files[@]}"; do
if [[ "$file" == *.$extension_to_remove ]]; then
files_to_remove+=("$file")
fi
done
echo "Files that would be removed: ${files_to_remove[@]}"
## Ask for confirmation before removing
echo
echo "This script is in simulation mode and won't actually delete any files."
echo "In a real scenario, you would ask for confirmation before deletion:"
echo "read -p 'Are you sure you want to remove these files? (y/n): ' confirm"
echo "if [ \"\$confirm\" == \"y\" ]; then rm \"\${files_to_remove[@]}\"; fi"
Enregistrez le fichier et rendez-le exécutable :
chmod +x /home/labex/project/cleanup_files.sh
Étape 3 : Exécution du script de nettoyage de fichiers
Exécutons maintenant notre script pour voir comment il identifie et filtre les fichiers :
./cleanup_files.sh
Cela devrait afficher une sortie indiquant quels fichiers seraient supprimés (ceux avec l'extension .txt).
Essayez-le avec différentes extensions de fichiers :
./cleanup_files.sh /home/labex/project/test_files pdf
Cela affichera les fichiers avec l'extension .pdf comme ceux qui seraient supprimés.
Étape 4 : Amélioration du script avec le traitement par lots
Améliorons notre script pour gérer plusieurs extensions de fichiers à la fois. Créez un nouveau fichier nommé advanced_cleanup.sh dans le répertoire /home/labex/project :
#!/bin/bash
## Directory to scan
target_dir=${1:-"/home/labex/project/test_files"}
## Default extensions to remove
extensions=("txt" "pdf")
## Override default extensions if provided as arguments
if [ $## -gt 1 ]; then
extensions=("${@:2}")
fi
echo "Scanning directory: $target_dir"
echo "Will filter files with these extensions: ${extensions[@]}"
## Change to the target directory
cd "$target_dir" || {
echo "Directory not found!"
exit 1
}
## Get all files in the directory
all_files=(*)
echo "All files: ${all_files[@]}"
## Create an array to store files to keep
declare -a files_to_keep=()
## Create an array to store files to remove
declare -a files_to_remove=()
## Process each file
for file in "${all_files[@]}"; do
## Extract the file extension
file_ext="${file##*.}"
## Check if the file extension is in our list
should_remove=false
for ext in "${extensions[@]}"; do
if [ "$file_ext" == "$ext" ]; then
should_remove=true
break
fi
done
## Add to appropriate array based on whether it should be removed
if [ "$should_remove" == true ]; then
files_to_remove+=("$file")
else
files_to_keep+=("$file")
fi
done
echo "Files to keep: ${files_to_keep[@]}"
echo "Files that would be removed: ${files_to_remove[@]}"
echo
echo "This script is in simulation mode and won't actually delete any files."
echo "In a real scenario, you would ask for confirmation before deletion."
Enregistrez le fichier et rendez-le exécutable :
chmod +x /home/labex/project/advanced_cleanup.sh
Exécutez le script avancé avec différentes combinaisons d'extensions :
./advanced_cleanup.sh /home/labex/project/test_files txt jpg
Cela identifiera les fichiers .txt et .jpg pour la suppression.
Comprendre ce que nous avons fait
Dans cet exercice pratique, nous avons :
- Créé un environnement de test avec différents types de fichiers
- Construit un script de base qui utilise le filtrage de tableaux pour identifier les fichiers avec des extensions spécifiques
- Amélioré le script pour gérer plusieurs extensions de fichiers
- Démontré comment utiliser les tableaux Bash dans un scénario réel
Cet exemple montre comment les techniques de manipulation de tableaux que nous avons apprises peuvent être appliquées à des problèmes pratiques, tels que la gestion des fichiers et les tâches de nettoyage. La capacité de filtrer les tableaux est un outil puissant dans votre boîte à outils de script Bash.
Résumé
Félicitations pour avoir terminé ce tutoriel sur la suppression d'éléments correspondants des tableaux Bash. Vous avez acquis des compétences précieuses qui amélioreront vos capacités de script shell :
- Création et manipulation de tableaux Bash
- Suppression d'éléments des tableaux à l'aide de la boucle for et de la méthode unset
- Approches alternatives pour le filtrage des éléments de tableau
- Application des techniques de filtrage de tableaux aux tâches de gestion de fichiers réelles
Ces compétences constituent une partie essentielle de votre boîte à outils de script Bash et peuvent être appliquées à diverses tâches d'automatisation, opérations de traitement de données et tâches d'administration système.
Quelques points clés à retenir de ce tutoriel :
- Les tableaux Bash offrent un moyen pratique de stocker et de traiter des collections de données
- Lors de la suppression d'éléments d'un tableau, soyez attentif au décalage des index
- Différentes méthodes de filtrage des tableaux présentent des avantages différents selon votre cas d'utilisation
- Les techniques de manipulation de tableaux peuvent être appliquées pour résoudre des problèmes pratiques comme la gestion des fichiers
Au fur et à mesure que vous poursuivez votre parcours avec le script Bash, ces compétences de manipulation de tableaux s'avéreront inestimables pour écrire des scripts plus efficaces et plus puissants. N'hésitez pas à vous référer à ce tutoriel chaque fois que vous avez besoin de rafraîchir vos connaissances sur le travail avec les tableaux Bash.



