Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 给函数指定一个数组,感叹号?_Bash_Unix - Fatal编程技术网

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的要求有点太高,所以我变戏法了mighty
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

也许我需要更精确,但我想传递不止一个数组。。。(但是,
$@
%*
之间的区别是什么?)简短版本:
“$@”
将是每个参数的单个字符串,
“$*”
将是一个包含所有参数的串联字符串。长版本将是最新版本。:)