在zsh中,如何将匿名数组传递到函数中?

在zsh中,如何将匿名数组传递到函数中?,zsh,Zsh,在zsh中,如何将匿名数组传递到函数中?e、 g.寻找类似于: foo() { echo ${1[2]} '\n'; } a=(abc def ghi) foo $a --> def 或者理想情况下: foo (abc def ghi) 找到了一个解决办法: foo() { local a=$1 local b=$2 echo ${(j:---:)${=b}} foreach d in ${${=b}} do echo $d done }

在zsh中,如何将匿名数组传递到函数中?e、 g.寻找类似于:

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

a=(abc def ghi)
foo $a

--> def
或者理想情况下:

foo (abc def ghi)

找到了一个解决办法:

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

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

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

其中参数2是一个白色分隔文本字符串,例如“一个badkljf odod”

您不能。函数与任何其他命令一样采用位置参数

还要注意,您的解决方案不允许任何“array”元素包含空格

我能想到的最干净的事情是要求调用方创建一个本地数组,然后从函数中读取它:

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

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

我知道bash的完成系统也有类似的特技,我认为zsh也有可能。这并不罕见。

不是用匿名数组解决的。。。但是我试过了!!猛击

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" "|"
函数连接{
本地tmp=(1美元)
对于((i=0;i您可以将数组的名称传递给函数,然后函数可以通过将名称解释为变量名来读取数组。这是一种技术,对于bash中的关联数组之类的事情也很有用。ZSH使操作非常容易,因为(p)操作符将以所需的方式解释变量

一个例子可以说明这一点。如果您定义此函数:

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

    echo "first array element is: " ${(P)${array_name}[1]}
}
然后将执行以下代码:

% a=(one two three)
% i_want_array "a"
first array element is:  one
为了澄清这一点,这是通过对真实数组进行操作来实现的,因此任何空格都可以正确处理:

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

如果只需要一个数组参数:as 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

请注意,上面的任何内容实际上都不起作用。这可能是针对您特定的未表达需求的解决方法,但它与问题几乎无关。这是对“如何拆分参数”问题的回答