Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/03/2022, à 22:25

Tawal

[Astuce][Bash] Passer plusieurs tableaux en paramètres à une fonction.

Hello,

Je suis tombé sur ce cas dans mes pérégrinations tongue
Et je l'ai résolu de cette manière :

#!/bin/bash

fun ()
{
   local n1 T1 n2 T2
   # 1er tableau
   n1="$1"
   T1=( "${@:2:$n1}" )
   shift $((n1+1))

   # 2ieme tableau (même méthode)
   n2="$1"
   T2=( "${@:2:$n2}" )
   shift $((n2+1))

   echo "T1 = ${T1[@]}"
   echo "T2 = ${T2[@]}"
   echo "Autres Args = $@"
}

# appel avec les tableaux
A=( a b c )
B=( 1 2 3 4 5 )
fun   ${#A[@]} "${A[@]}"   ${#B[@]} "${B[@]}"   arg_sup etc ...

Résultat (avec pour nom de script : fun_tab)

$ ./fun_tab
T1 = a b c
T2 = 1 2 3 4 5
Autres Args = arg_sup ect ...
$

Voilà, c'est ma solution, et je suis ouvert à toute remarque ou autre moyen.

Edit:
Correction d'une (2 en fait) erreur dans la ré-écriture sur le forum (et non pas de copié/collé tongue)

Dernière modification par Tawal (Le 18/03/2022, à 22:30)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#2 Le 19/03/2022, à 11:54

kamaris

Re : [Astuce][Bash] Passer plusieurs tableaux en paramètres à une fonction.

Autre possibilité classique : faire se terminer les tableaux par une valeur de référence et les parcourir jusqu'à la rencontrer (comme les NULL-terminated ou 0-terminated arrays en C).

Hors ligne

#3 Le 19/03/2022, à 12:46

Watael

Re : [Astuce][Bash] Passer plusieurs tableaux en paramètres à une fonction.

hmm

tab1=( 1 2 3 4 )
tab2=( a b c d )

maFonc() {
    declare -n ar1=$1 ar2=$2
    echo "$1 = ${ar1[@]}"
    echo "$2 = ${ar2[@]}"
}

maFonc tab1 tab2

smile

$ help declare | grep -- -n
      -n        make NAME a reference to the variable named by its value

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#4 Le 20/03/2022, à 12:16

Tawal

Re : [Astuce][Bash] Passer plusieurs tableaux en paramètres à une fonction.

C'est bien vu kamaris wink
Mais cette méthode comme la mienne présente un inconvénient : le nombre maximum d'arguments.

@Watael : j'y avais bien pensé, mais cela ne "respecte" pas trop la portée des variables utilisées dans une fonction.
(la fonction n'est pas censée modifier des variables globales il me semble non ?)
Cela dit, cette solution passe (quasiment) outre la limite du nombre d'arguments.
Mais il faut garder à l'esprit qu'une modification d'un tableau dans la fonction modifie ce même tableau dans le corps du programme.

Pour sûr, la méthode de Watael est la plus concise, celle de Kamaris m'abroge de 2 arguments (les nb d'éléments de chaque tableau) mais la fonction doit faire une boucle pour lire les arguments (tableau) (autre fonction de lecture de tableau ?),
bref, je trouve quand même qu'il y a là 3 bonnes solutions.


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#5 Le 20/03/2022, à 13:30

Watael

Re : [Astuce][Bash] Passer plusieurs tableaux en paramètres à une fonction.

#!/bin/bash

lasVegas() (
    declare -n ar1=$1 ar2=$2
    ar1=( "${ar1[@]}" 10 )
    ar2=( "${ar2[@]}" z )
    echo "$1 = ${ar1[@]}"
    echo "$2 = ${ar2[@]}"
)
tab1=( 1 2 3 4 )
tab2=( a b c d )

lasVegas tab1 tab2
echo
echo "${tab1[@]}"
echo "${tab2[@]}"
$ ./scriptTableau
tab1 = 1 2 3 4 10
tab2 = a b c d z

1 2 3 4
a b c d
$

la fonction s'exécute dans un sous-shell, qui ne modifie pas l'environnement courant du script.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 20/03/2022, à 13:33

Tawal

Re : [Astuce][Bash] Passer plusieurs tableaux en paramètres à une fonction.

Ça j'y pense jamais à déclarer une fonction en sous-shell.
Et donc je retiens cette solution.

Merci.

Edit:
Rigolo le nom de la fonction tongue

Dernière modification par Tawal (Le 20/03/2022, à 13:35)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne