我试图给一个函数一个数组。最后,我成功地达成了这个解决方案:
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}的用途。!是什么意思?
另一个问题是,对于我的shell,有6个元素而不是3个
发布于 2019-01-17 10:48:35
如果只想将数组的值传递给函数,可以这样做:
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 arrhttps://stackoverflow.com/questions/54233946
复制相似问题