Frage

In zsh, wie gehe ich anonyme Arrays in Funktionen? z.B. die Suche nach so etwas wie:

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

a=(abc def ghi)
foo $a

--> def

oder im Idealfall:

foo (abc def ghi)
War es hilfreich?

Lösung 5

Herausgefunden eine Abhilfe:

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

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

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

Wo parameter2 eine Reihe von weißen getrennten Text ist, z.B. 'A badkljf odod'

Andere Tipps

Sie können nicht. Funktionen übernehmen Positionsparameter wie jeder andere Befehl.

Beachten Sie auch, dass Ihre Problemumgehung ermöglicht keine der „array“ Elemente Leerzeichen enthalten.

Die sauberste, was ich denken kann, ist zu verlangen, dass der Anrufer ein lokales Array erstellen, dann ist es aus der Funktion lesen:

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

Ich weiß, bash funktioniert ähnlich Akrobatik für seine Vollendung System, und ich denke, zsh könnte auch. Es ist nicht allzu ungewöhnlich.

können Sie passieren die name des Arrays an die Funktion und dann kann die Funktion das Array lesen, indem Sie den Namen als Variablennamen zu interpretieren. Es ist eine Technik, die für Dinge wie assoziative Arrays in bash auch nützlich ist. ZSH macht es sehr einfach zu tun, da der (P) wird von einem Operator der Variable in der gewünschten Art und Weise interpretieren.

Ein Beispiel soll dies verdeutlichen. Wenn Sie diese Funktion definieren:

function i_want_array () {
    local array_name=$1

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

Dann wird der folgende Code wird es ausführen:

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

Und nur zu klären, funktioniert dies, indem auf der realen Array arbeitet, so wird jeder Leerzeichen korrekt behandelt:

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

Nicht mit einem anonymen Array gelöst ... aber ich habe versucht, diese Sache 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" "|"

Wenn Sie nur ein Array-Parameter:. Als Schwanz 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top