Bash Scripting

Retourner efficacement des tableaux depuis des fonctions Bash

Spread the love

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

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 :

  1. my_array_function crée un tableau local.
  2. Il utilise echo, tr pour remplacer les espaces par des retours à la ligne et paste pour joindre les éléments avec le délimiteur.
  3. La substitution de commande capture la sortie dans returned_string.
  4. 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 :

  1. my_array_function enregistre l’IFS actuel.
  2. Il définit IFS sur un caractère de retour à la ligne.
  3. Il imprime chaque élément du tableau sur une nouvelle ligne.
  4. Il restaure IFS.
  5. 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é.

Laisser un commentaire

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