给一个函数数组,感叹号?

时间:2019-01-17 10:32:41

标签: 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}的目的。 !是什么意思?

另一个问题是,对于我的外壳,有6个元素而不是3个

1 个答案:

答案 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