【问题标题】:In zsh, how do I pass anonymous arrays into functions?在 zsh 中,如何将匿名数组传递给函数?
【发布时间】:2017-07-25 04:42:18
【问题描述】:

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

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

a=(abc def ghi)
foo $a

--> def

或者理想情况下:

foo (abc def ghi)

【问题讨论】:

  • 请注意,上面没有任何实际工作。

标签: zsh


【解决方案1】:

您可以将数组的名称传递给函数,然后函数可以通过将名称解释为变量名称来读取数组。这种技术对于 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】:

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

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

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

    $ 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 也可以。这不是太不寻常。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 有趣的是,据我所知,这与 bash 和 zsh 配合得很好。
      【解决方案4】:

      没有用匿名数组解决......但我试过这个东西!重击!!...

      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" "|"
      

      【讨论】:

        【解决方案5】:

        想出一个解决方法:

        foo() {
          local a=$1
          local b=$2
        
          echo ${(j:---:)${=b}}
        
          foreach d in ${${=b}}
          do
              echo $d
          done
        }
        

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

        【讨论】:

        • 这可能是您特定未表达要求的解决方法,但它与问题几乎无关。这是对“如何拆分参数?”问题的回答
        猜你喜欢
        • 1970-01-01
        • 2015-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多