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

Aar*_* Fi 5 zsh

在zsh中,如何将匿名数组传递给函数?例如,寻找类似的东西:

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

a=(abc def ghi)
foo $a

--> def
Run Code Online (Sandbox Code Playgroud)

或者理想情况:

foo (abc def ghi)
Run Code Online (Sandbox Code Playgroud)

Mat*_*len 9

您可以将数组的名称传递给函数,然后函数可以通过将名称解释为变量名称来读取数组。这种技术对于 bash 中的关联数组等内容也很有用。ZSH 使它变得非常容易,因为 (P) 运算符将以所需的方式解释变量。

一个例子将说明这一点。如果你定义这个函数:

function i_want_array () {
    local array_name=$1

    echo "first array element is: " ${(P)${array_name}[1]}
}
Run Code Online (Sandbox Code Playgroud)

然后下面的代码将执行它:

% a=(one two three)
% i_want_array "a"
first array element is:  one
Run Code Online (Sandbox Code Playgroud)

只是为了澄清,这是通过对真实数组进行操作来工作的,因此可以正确处理任何空格:

% a=("one two" three)
% i_want_array "a"
first array element is:  one two
Run Code Online (Sandbox Code Playgroud)


Eev*_*vee 5

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

另请注意,您的解决方法不允许任何“数组”元素包含空格。

我能想到的最简洁的方法是要求调用者创建一个本地数组,然后从函数中读取它:

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

我知道 bash 的补全系统有类似的功能,我认为 zsh 也可能如此。这并不是太不寻常。


Aar*_* Fi -3

想出了一个解决方法:

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

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

  foreach d in ${${=b}}
  do
      echo $d
  done
}
Run Code Online (Sandbox Code Playgroud)

其中parameter2是一串白色分隔的文本,例如'a badkljf odod'

  • 这可能是针对您特定的未表达需求的解决方法,但它与问题几乎无关。这是对“如何拆分参数?”问题的回答。 (3认同)