Considérons que j'ai un très grand tableau $large_list
, existe-t-il un moyen d'écrire une fonction qui prendra le tableau en argument? Par exemple:
echo_idx_array () {
arr="$1"
idx="$2"
echo "${arr[$idx]}"
}
Quelle est la stratégie habituelle pour faire quelque chose comme ça? J'ai essayé de donner la variable $large_list
mais elle était vide.
Je suis prêt à modifier la fonction pour l'adapter à tout changement dans la liste des arguments.
Pour mémoire, j'utilise ksh88, et je recherche des réponses aussi portables que possible.
EDIT : Jusqu'à présent, le mieux que j'ai pu trouver est de parcourir le tableau et d'envoyer chaque élément comme argument à la fonction. Cela semble incroyablement laid et sujet aux erreurs, sans parler du fait qu'il atteindra rapidement une limite. Voici ce que j'ai fait:
foo () {
echo $*
}
cmd="foo "
while [[ $i -lt $MAX_ARR_SIZE ]]; do
cmd="$cmd ${large_list[$i]}"
((i=i+1))
done
eval $cmd
N'y a-t-il pas quelque chose de mieux à faire?
func "${array[@]}"
? Si vous avez seulement besoin de passer un élément, passez simplement l'élément - pas besoin de le rendre plus compliqué en passant un tableau et un index."${array[$@]}
. Votre suggestion fonctionne réellement. Mea culpa.Réponses:
Pour passer les éléments du tableau comme arguments à la fonction, utilisez la syntaxe ksh pour développer les éléments du tableau sous forme de liste.
Le
[@]
suffixe en fait une extension de tableau. Les guillemets doubles protègent chaque élément contre toute nouvelle expansion (division et globalisation). Le résultat de l'expansion n'est pas en général un mot comme c'est généralement le cas avec les guillemets doubles, mais autant de mots qu'il y a d'éléments dans le tableau.Le N ème élément du tableau est alors . Pour y accéder, vous devez utiliser ; voir Utiliser une référence de variable "à l'intérieur" d'une autre variable
${N}
eval
la source
myarray=("hello world" wibble)
(2 éléments, dont le premier contient un espace):work_on_array "${myarray[@]}"
passe 2 paramètreshello world
etwibble
;work_on_array ${myarray[@]}
passe 2 paramètreshello
,world
etwibble
. Et avecmyarray=(*)
,work_on_array ${myarray[@]}
passe la liste des fichiers dans le répertoire courant. (C'est donc l'un des nombreux cas où mes conseils font une différence pratique.)hello
,world
etwibble
faire 3 paramètres.)Il y a un moyen dans bash 4.3+, qui vient probablement de ksh:
Voir aussi
declare -n
.la source
Cela dépend du Korn Shell… les récentes versions AT&T ksh93 et mksh prennent en charge ceci:
Dans mon interpréteur de commandes actuel, cela produit «b».
la source