#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
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é )
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 !
En 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.
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
$ 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
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 !
En 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
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 !
En ligne