Luttant pendant un moment en passant un tableau en argument mais cela ne fonctionne pas quand même. J'ai essayé comme ci-dessous:
#! /bin/bash
function copyFiles{
arr="$1"
for i in "${arr[@]}";
do
echo "$i"
done
}
array=("one" "two" "three")
copyFiles $array
Une réponse avec des explications serait bien.
Edit: Fondamentalement, j'appellerai éventuellement la fonction à partir d'un autre fichier de script. Plz expliquer les contraintes si possible.
copyFiles {…}
andcopyFiles(){…}
etcopyFiles() {…}
, mais pascopyFiles{…}
. Notez l'espace dans la variante sans()
Vous pouvez également passer le tableau comme référence. c'est à dire:
mais notez que toutes les modifications apportées à arr seront apportées à array.
la source
Si vous souhaitez passer un ou plusieurs arguments ET un tableau, je propose cette modification du script de @AB. Le
tableau doit être le dernier argument et un seul tableau peut être passé.
Sortie:
la source
shift
utilisation.shift 6
.arr
. Est-il possible d'avoir un paramètre de tableau au milieu? Ou même plusieurs paramètres de tableaux?function copyAndMove() { msg1=$1 ; arr1=...?... ; msg2=? ; arr2=...?... ; msg3=? ; ... }
. Comme je définirais en python:def copyAndMove(msg1="foo", cpFiles=[], msg2="bar", mvFiles=[], msg3="baz"): ...
. Qu'à cela ne tienne, j'ai trouvé stackoverflow.com/a/4017175/472245Il y a quelques problèmes. Voici le formulaire de travail:
Il doit y avoir au moins un espace entre la déclaration de fonction et
{
Vous ne pouvez pas utiliser
$array
, cararray
un tableau n'est pas une variable. Si vous voulez obtenir toutes les valeurs d'un tableau, utilisez"${array[@]}"
Dans votre déclaration de fonction principale dont vous avez besoin
arr="$@"
pour"${array[@]}"
développer les valeurs indexées séparées par des espaces,$1
vous obtiendrez uniquement la première valeur. Pour obtenir toutes les valeurs, utilisezarr="$arr[@]}"
.la source
arr=("$@")
break
ci - dessousecho "$i"
. Dans votre version, vous verrez toujours tous les éléments. Cependant, il devrait y avoir trois lignes.Voici un exemple légèrement plus grand. Pour plus d'explications, voir les commentaires dans le code.
la source
Le meilleur moyen est de passer comme argument de position. Rien d'autre. Vous pouvez passer en tant que chaîne, mais de cette façon peut causer des problèmes. Exemple:
ou
sortie:
Vous voulez dire que si la valeur du tableau a des symboles d’espace, vous devez d'abord citer les éléments avant de passer pour accéder à la valeur par index dans la fonction use $ 1 $ 2 $ 3 ... paramètres de position. Où index 0 -> 1, 1 -> 2, ... Pour itérer l’accès, il est préférable d’utiliser toujours $ 1 et après Shift. Rien de plus n'est nécessaire. Vous pouvez passer des arguments sans aucun tableau comme celui-ci:
bash media construit automatiquement un tableau à partir des arguments passés qui les ont passés à fonction, puis vous avez des arguments de position. De plus, lorsque vous écrivez $ {array [2]}, vous écrivez réellement les arguments suivants un, deux, trois et vous les transmettez à la fonction. Donc, ces appels sont équivalents.
la source
Aussi laid que cela puisse paraître, voici une solution de contournement qui fonctionne tant que vous ne passez pas explicitement un tableau, mais une variable correspondant à un tableau:
Je suis sûr que quelqu'un peut proposer une mise en œuvre plus claire de l'idée, mais j'ai trouvé que c'était une meilleure solution que de passer un tableau au fur
"{array[@]"}
et à mesure , puis d'y accéder en interne à l'aide dearray_inside=("$@")
. Cela devient compliqué quand il y a d'autresgetopts
paramètres de position . Dans ces cas, j'ai d'abord dû déterminer, puis supprimer les paramètres non associés au tableau en utilisant une combinaison de lashift
suppression d'éléments de tableau.Une perspective puriste considère probablement cette approche comme une violation de la langue, mais, d'une manière pragmatique, cette approche m'a évité beaucoup de chagrin. Sur un sujet connexe, j'utilise également
eval
pour affecter un tableau construit en interne à une variable nommée en fonction d'un paramètre quetarget_varname
je transmets à la fonction:la source
array_internally
un alias de celui - ci:declare -n array_internally=$1
. Et le reste, à propos de "devient compliqué" et de "déterminer puis supprimer ..." s'applique quelle que soit la façon dont vous passez le tableau, je ne vois donc pas à quoi ça sert. Eteval
utiliser un tableau contenant potentiellement des caractères spéciaux n’attend que le chagrin à une date ultérieure.