Bash ne supporte pas directement le renvoi de tableaux depuis les fonctions. Cependant, nous pouvons y parvenir en utilisant des techniques astucieuses. Cet article explore deux méthodes efficaces : l’utilisation de la substitution de commande et la manipulation du séparateur de champs interne (IFS).
Table des matières
- Substitution de commande
- Renvoyer des tableaux avec la substitution de commande
- Renvoyer des tableaux avec IFS
- Choisir la meilleure méthode
Substitution de commande
La substitution de commande capture la sortie d’une commande et l’affecte à une variable. Ceci constitue la base de notre première méthode. La clé est de formater la sortie de la fonction pour une analyse facile en un tableau.
Renvoyer des tableaux avec la substitution de commande
Cette méthode consiste à joindre les éléments du tableau en une chaîne de caractères à l’aide d’un délimiteur, puis à diviser la chaîne en un tableau. Voyons un exemple :
my_array_function() {
local array=("pomme" "banane" "cerise")
local delimiter="|"
echo "${array[*]}" | tr ' ' 'n' | paste -sd"$delimiter" -
}
returned_string=$(my_array_function)
returned_array=(${returned_string//|$delimiter/ })
echo "Tableau renvoyé : ${returned_array[@]}"
Voici comment cela fonctionne :
my_array_function
crée un tableau local.- Il utilise
echo
,tr
pour remplacer les espaces par des retours à la ligne etpaste
pour joindre les éléments avec le délimiteur. - La substitution de commande capture la sortie dans
returned_string
. - Le développement de paramètre remplace le délimiteur par des espaces pour créer le tableau
returned_array
.
Cette approche est simple et efficace, mais le délimiteur ne doit pas apparaître dans les éléments du tableau. Si tel est le cas, envisagez d’utiliser un caractère moins courant ou une méthode de gestion des délimiteurs plus robuste.
Renvoyer des tableaux avec IFS
Le séparateur de champs interne (IFS) contrôle la façon dont Bash divise les chaînes de caractères en mots. Nous pouvons l’utiliser pour renvoyer des tableaux en définissant IFS dans la fonction et en imprimant les éléments du tableau. Le script appelant utilise ensuite l’IFS modifié pour analyser la sortie.
my_array_function() {
local array=("pomme" "banane" "cerise")
local old_ifs="$IFS"
IFS=$'n'
printf "%sn" "${array[@]}"
IFS="$old_ifs"
}
returned_array=($(my_array_function))
echo "Tableau renvoyé : ${returned_array[@]}"
Explication :
my_array_function
enregistre l’IFS actuel.- Il définit IFS sur un caractère de retour à la ligne.
- Il imprime chaque élément du tableau sur une nouvelle ligne.
- Il restaure IFS.
- Le script appelant utilise le retour à la ligne comme séparateur pour créer le tableau.
Cette méthode est plus propre si les éléments de votre tableau ne contiennent pas de retours à la ligne. Pour les éléments contenant des retours à la ligne, vous devez choisir un caractère IFS différent, moins probable.
Choisir la meilleure méthode
Les deux méthodes offrent des solutions viables. Le meilleur choix dépend de vos besoins spécifiques et du contenu du tableau. L’approche de substitution de commande offre plus de flexibilité dans le choix du délimiteur, tandis que l’utilisation d’IFS peut être plus propre si vos données le permettent. Privilégiez toujours un code propre, robuste et bien commenté.