Dans zsh, comment puis-je passer des tableaux anonymes en fonctions?

StackOverflow https://stackoverflow.com/questions/442012

  •  22-07-2019
  •  | 
  •  

Question

Sous zsh, comment puis-je passer des tableaux anonymes en fonctions? par exemple. à la recherche de quelque chose comme:

foo() {
  echo ${1[2]} '\n';
}

a=(abc def ghi)
foo $a

--> def

Ou idéalement:

foo (abc def ghi)
Était-ce utile?

La solution 5

Vous avez trouvé une solution de contournement:

foo() {
  local a=$1
  local b=$2

  echo ${(j:---:)${=b}}

  foreach d in ${${=b}}
  do
      echo $d
  done
}

Où paramètre2 est une chaîne de texte séparé en blanc, par ex. "un mauvais odd"

Autres conseils

Vous ne pouvez pas. Les fonctions prennent des paramètres de position comme toute autre commande.

Notez également que votre solution de contournement n'autorise aucun des "tableaux". éléments devant contenir des espaces.

La chose la plus simple à laquelle je puisse penser est de demander à l'appelant de créer un tableau local, puis de le lire à partir de la fonction:

$ foo() {
   for element in $FOO_ARRAY
   do
       echo "[$element]"
   done
}
$ local FOO_ARRAY; FOO_ARRAY=(foo bar baz quux)
$ foo
[foo]
[bar]
[baz]
[quux]

Je sais que bash utilise des acrobaties similaires pour son système d’achèvement, et je pense que zsh le pourrait aussi. Ce n'est pas trop inhabituel.

Vous pouvez transmettre le nom du tableau à la fonction, qui peut alors lire le tableau en interprétant le nom comme un nom de variable. C'est une technique qui est également utile pour des choses comme les tableaux associatifs dans bash. ZSH facilite la tâche, car l'opérateur (P) interprétera la variable de la manière souhaitée.

Un exemple le clarifiera. Si vous définissez cette fonction:

function i_want_array () {
    local array_name=$1

    echo "first array element is: " ${(P)${array_name}[1]}
}

Ensuite, le code suivant l'exécutera:

% a=(one two three)
% i_want_array "a"
first array element is:  one

Et juste pour clarifier, cela fonctionne en opérant sur le tableau réel, donc tout espace blanc est géré correctement:

% a=("one two" three)
% i_want_array "a"
first array element is:  one two

Pas résolu avec un tableau anonyme ... Mais j'ai essayé cette chose en !! BASH !! ...

function join {
  local tmp=($1)

  for (( i=0 ; i<${#tmp[@]}-1 ; i++ )) ; do
    echo -n ${tmp[$i]}$2
  done

  echo ${tmp[$i]}
}

test="abc def ghi"

join "$test" "|"

Si vous n'avez besoin que d'un paramètre de tableau: comme argument final.

foo() {
  : if you have any leading non-array args, grab those first:
  local arg1="$1"
  shift
  local arg2="$1"
  shift
  : now $@ is your array arg
  echo $@[2] '\n';
}

a=(abc def ghi)
foo "arg 1" arg2 $a

--> def
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top