8

zshでは、匿名配列を関数に渡すにはどうすればよいですか? たとえば、次のようなものを探します:

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

a=(abc def ghi)
foo $a

--> def

または理想的には:

foo (abc def ghi)
4

5 に答える 5

10

配列の名前を関数に渡すと、関数はその名前を変数名として解釈して配列を読み取ることができます。bashの連想配列などにも使えるテクニックです。(P) 演算子が変数を目的の方法で解釈するため、ZSH を使用すると非常に簡単に実行できます。

例でこれを明確にします。この関数を定義すると:

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
于 2013-02-04T19:09:09.073 に答える
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 もそうすると思います。それはあまりにも珍しいことではありません。

于 2009-08-24T21:18:06.363 に答える
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" "|"
于 2013-01-22T12:37:56.270 に答える
-2

回避策を見つけました:

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

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

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

parameter2 は、「a badkljf odod」など、白で区切られたテキストの文字列です。

于 2009-01-14T08:11:10.110 に答える