Domanda

In zsh, come posso passare array anonimi nelle funzioni? per esempio. cercando qualcosa come:

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

a=(abc def ghi)
foo $a

--> def

O idealmente:

foo (abc def ghi)
È stato utile?

Soluzione 5

Individuato una soluzione alternativa:

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

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

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

Dove parametro2 è una stringa di testo separato da bianco, ad es. 'a badkljf odod'

Altri suggerimenti

Non puoi. Le funzioni accettano parametri posizionali come qualsiasi altro comando.

Tieni inoltre presente che la soluzione alternativa non consente alcuno degli array " array " elementi per contenere spazi bianchi.

La cosa più pulita a cui riesco a pensare è richiedere che il chiamante crei un array locale, quindi lo legge dalla funzione:

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

So che bash fa acrobazie simili per il suo sistema di completamento, e penso che anche zsh potrebbe farlo. Non è troppo insolito.

È possibile passare il nome dell'array alla funzione e quindi la funzione può leggere l'array interpretando il nome come un nome variabile. È una tecnica utile anche per cose come array associativi in ??bash. ZSH lo rende molto semplice, poiché l'operatore (P) interpreterà la variabile nel modo desiderato.

Un esempio lo chiarirà. Se si definisce questa funzione:

function i_want_array () {
    local array_name=$1

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

Quindi verrà eseguito il seguente codice:

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

E solo per chiarire, questo funziona operando sull'array reale, quindi qualsiasi spazio bianco viene gestito correttamente:

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

Non risolto con un array anonimo ... Ma ho provato questa cosa in !! 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" "|"

Se hai solo bisogno di un parametro array: come tail args.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top