Bash 给函数指定一个数组,感叹号?
我试图给一个函数一个数组。我最终成功实现了此解决方案:Bash 给函数指定一个数组,感叹号?,bash,unix,Bash,Unix,我试图给一个函数一个数组。我最终成功实现了此解决方案: 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}的用途。是什么意思 另一个问题是,对于我的shel
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个元素。如果只想将数组的值传递给函数,可以执行以下操作:
test_arr() {
for i in "$@"; do
echo $i
printf '\n'
done
:
}
arr=("lol 1" "lol 2" "lol 3")
test_arr "${arr[@]}"
“${arr[@]}”
将所有正确分隔的值传递给函数,我们可以通过$@
(所有参数)访问这些值
代码>您所询问的用于间接引用。也就是说,“${!1}”
不是第一个参数的值,而是其名称与第一个参数的值相同的变量的值
我可能错过了一些东西,但似乎想要同时结合间接寻址和访问间接引用数组的所有项会对shell的要求有点太高,所以我变戏法了mightyeval
(开始谨慎的好理由)来帮助我们。我已经破解了它,它允许您将数组名称传递给函数,然后根据该名称访问其项,如函数的第一个参数所示,但它并不漂亮,仅此一点就足以阻止您不这么做。它确实创建了一个局部变量/数组,作为您的示例,假设您有理由这样做
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
也许我需要更精确,但我想传递不止一个数组。。。(但是,$@
和%*
之间的区别是什么?)简短版本:“$@”
将是每个参数的单个字符串,“$*”
将是一个包含所有参数的串联字符串。长版本将是最新版本。:)