zshでは、匿名配列を関数に渡すにはどうすればよいですか? たとえば、次のようなものを探します:
foo() {
echo ${1[2]} '\n';
}
a=(abc def ghi)
foo $a
--> def
または理想的には:
foo (abc def ghi)
zshでは、匿名配列を関数に渡すにはどうすればよいですか? たとえば、次のようなものを探します:
foo() {
echo ${1[2]} '\n';
}
a=(abc def ghi)
foo $a
--> def
または理想的には:
foo (abc def ghi)
配列の名前を関数に渡すと、関数はその名前を変数名として解釈して配列を読み取ることができます。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
できません。関数は、他のコマンドと同様に位置パラメーターを取ります。
また、回避策では、「配列」要素に空白を含めることができないことに注意してください。
私が考えることができる最もクリーンなことは、呼び出し元がローカル配列を作成し、それを関数から読み取ることを要求することです:
$ 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 もそうすると思います。それはあまりにも珍しいことではありません。
匿名配列では解決されません...しかし、私はこれを試してみました!! 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" "|"
回避策を見つけました:
foo() {
local a=$1
local b=$2
echo ${(j:---:)${=b}}
foreach d in ${${=b}}
do
echo $d
done
}
parameter2 は、「a badkljf odod」など、白で区切られたテキストの文字列です。