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

时间:2009-01-14 05:28:23

标签: zsh

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

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

a=(abc def ghi)
foo $a

--> def

理想情况下:

foo (abc def ghi)

5 个答案:

答案 0 :(得分:4)

你做不到。函数采用与任何其他命令一样的位置参数。

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

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

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

我知道bash为其完成系统做了类似的杂技,我认为zsh也可能。这不是太不寻常。

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:0)

没有用匿名数组解决......但是我试过这个东西!! 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" "|"

答案 3 :(得分:0)

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

答案 4 :(得分:-2)

找出解决方法:

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

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

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

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