首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >给一个函数一个数组,感叹号?

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

Stack Overflow用户
提问于 2019-01-17 10:32:40
回答 1查看 167关注 0票数 0

我试图给一个函数一个数组。最后,我成功地达成了这个解决方案:

代码语言:javascript
复制
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个

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-17 10:48:35

如果只想将数组的值传递给函数,可以这样做:

代码语言:javascript
复制
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 (开始谨慎的好理由)来帮助我们。我破解了这个函数,它允许您将数组名称传递给一个函数,然后根据该函数的第一个参数访问它的项,但是它并不漂亮,光是这样做就足够让人沮丧了。它确实创建了一个局部变量/数组,作为您的示例,假设有一些原因需要这样做。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54233946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档