如何将 an 传递array
给函数,特别是如果它位于中间某处?和"${b}"
似乎"${b[@]}"
都只传递第一个项目,那么有没有一种方法可以同时调用和检索它,正确吗?
#/usr/bin/env bash
touch a b1 b2 b3 c
f()
{
local a="${1}"
local b="${2}"
local c="${3}"
ls "${b[@]}" # expected b1 b2 b3
}
a=a
b=("b1" "b2" "b3")
c=c
f "${a}" "${b}" "${c}"
f "${a}" "${b[@]}" "${c}"
rm a b1 b2 b3 c
答案1
在bash
shell 中,就像在复制了ksh
数组设计的 shell中一样bash
,"${array[@]}"
扩展为数组的所有不同元素(按数组索引排序),并且"$array"
与 相同"${array[0]}"
。
因此,要将数组的所有元素传递给函数,就是f "${array[@]}"
.
现在,函数的参数是通过 访问的"$@"
,因此您的函数应该类似于:
f() {
ls -ld -- "$@"
}
f "$a" "${b[@]}" "$c"
另一种选择是按名称传递数组并使用命名引用(bash
从ksh
(ksh93) 复制的另一个功能):
f() {
typeset -n array="$1"
ls -ld -- "${array[@]}"
}
f b
或者f
采用 3 个参数:一个文件名、一个数组名和另一个文件名:
f() {
typeset -n array="$2"
ls -ld -- "$1" "${array[@]}" "$3"
}
f "$a" b "$c"
在几乎所有其他具有数组(csh
、tcsh
、rc
、es
、zsh
、yash
、fish
)的 shell 中,您只需使用$array
来扩展到数组的所有元素。在所有其他 shell 中,数组也是普通(非稀疏)数组。但有一些警告:在 csh/tcsh 和 yash 中,$array
仍然会受到 split+glob 的影响,并且您需要$array:q
in(t)csh
和"${array[@]}"
inyash
来解决它,而在, 中zsh
,$array
会受到空删除的影响(再次"${array[@]}"
or"$array[@]"
或"${(@)array}"
有效)周围)。