我正在尝试为函数提供数组。我成功完成了此解决方案:
test_arr() {
local a="${!1}"
for i in ${a[@]}
do
echo $i
printf '\n'
done
}
arr=("lol 1" "lol 2" "lol 3");
test_arr arr[@]
但是有两个问题:通过local
变量存在一个副本。因此,我可以直接在for循环中使用$1
,而我不了解${!1}
的目的。 !
是什么意思?
另一个问题是,对于我的外壳,有6个元素而不是3个
答案 0 :(得分:1)
如果您只想将数组的值传递给函数,则可以执行以下操作:
test_arr() {
for i in "$@"; do
echo $i
printf '\n'
done
:
}
arr=("lol 1" "lol 2" "lol 3")
test_arr "${arr[@]}"
"${arr[@]}"
将所有正确分隔的值传递给该函数,我们可以在其中通过$@
(所有参数)访问它们。
!
用于间接引用。即"${!1}"
不是第一个参数的值,而是名称是第一个参数的值的变量的值。
我本可以错过一些东西,但是似乎想要组合间接并同时访问所有间接引用数组的所有项,这对shell的要求太高了,所以我想到了强大的eval
(开始谨慎的充分理由)可以帮助我们。我已经破解了它,它允许您将数组名称传递给函数,然后根据该名称访问该函数的项,如函数的第一个参数所示,但它并不漂亮,仅此而已就足以使人沮丧它。假设有某些原因,它确实会创建一个局部变量/数组作为您的示例。
test_arr() {
local a
eval a=(\"\$\{$1\[@\]\}\")
for i in "${a[@]}"; do
echo $i
done
}
arr=("lol 1" "lol 2" "lol 3")
test_arr arr