在zsh中,如何将匿名数组传递给函数?例如,寻找类似以下的内容:
最理想的情况是:
foo() {
echo ${1[2]} '\n';
}
a=(abc def ghi)
foo $a
--> def
最理想的情况是:
foo (abc def ghi)
foo() {
echo ${1[2]} '\n';
}
a=(abc def ghi)
foo $a
--> def
foo (abc def ghi)
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
a
,而本地变量是 array_name
。如果您有这两个同名变量,则解决方案将无法正常工作。 - vladZams你不能这样做。函数像其他命令一样需要位置参数。
还要注意,你的解决方法不允许任何“数组”元素包含空格。
我能想到最干净的方法是要求调用者创建一个本地数组,然后从函数中读取它:
$ 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也有。这并不是太不寻常的。
local
。 - Denis Howefoo() {
: 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中尝试了这个东西!!...
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'