如何将数组传递给 Bash 函数?
Posted
技术标签:
【中文标题】如何将数组传递给 Bash 函数?【英文标题】:How to pass an array into a Bash function? 【发布时间】:2017-06-03 13:24:42 【问题描述】:我有一个 Bash 脚本,我不知道如何在其中引用变量。 任何帮助将不胜感激。
这段代码完美运行:
myfunction()
for i in "$BASE_ARRAY[@]"
do
我想将数组的名称作为变量传递给函数,这样我就可以在其他数组中重复使用它。这是我尝试失败的代码:
myfunction()
for i in "$$1[@]"
do
然后我将以下内容传递给函数:
myfunction BASE_ARRAY
【问题讨论】:
看起来像:***.com/questions/1063347/… 【参考方案1】:我从来没有成功地将数组传递给函数。
对我来说,这两个选项总是将 content 传递给函数,或者(从 bash 4.3 开始)传递将使用引用访问的数组名称。请考虑以下示例。
#!/usr/bin/env bash
myfunc()
local -n arr=$1
printf '%s\n' "$arr[1]"
arr[1]=HELLO
a=(one two three)
myfunc a
printf '%s\n' "$a[1]"
产生:
$ ./sample
two
HELLO
请注意,local -n
与 declare -n
类似,因为它不提供数组的本地副本,而是提供指向原始内容的本地指针 .在这个例子中,如果你改变$arr[]
,你实际上是在改变原来的数组$a[]
。
将数组内容传递给函数的传统方法已在 *** 上多次描述,几乎不值得一提;你会很容易找到例子。
【讨论】:
这太棒了。我不知道。感谢您再次扩展我的大脑。 这非常好,我敢说,令人兴奋(至少与 shell 语法一样多)。但它也很新。我有一个完全打补丁的 CenOS 7 系统,而 bash 仍然是 4.2.26 版本。要在随机系统上广泛部署的脚本中使用,恐怕我们将不得不等待一段时间。 这似乎与 Fred 的回答非常相似。将 -n 添加到局部变量有什么好处吗?它更快吗?如果我理解正确,使用 -n 将允许我在函数内对实际数组进行更改?【参考方案2】:试试这个:
myfunction()
local x="$1[@]"
for i in "$!x"
do
Bash 中的间接引用类似于 "$!VARIABLE_CONTAINING_NAME_TO_EXPAND
"。对于不是数组的变量来说,这很简单。
但是当您需要访问数组中的一个项目(或您的情况下的所有项目)时,您需要将整个引用放在要扩展的变量中。
【讨论】:
$1[@]
扩展成什么?这对我来说没有意义。位置参数是$@
,如果您想查看以$1
命名的数组的数组元素,在我看来您需要eval
。
假设 $1(第一个位置参数)包含 ARRAY_NAME。然后 $1[@] 将扩展为 ARRAY_NAME[@]。 $!x 步骤将执行数组元素的实际检索。
写成local x="$1[@]"
可能更清楚(虽然原始代码完全等价)。以上是关于如何将数组传递给 Bash 函数?的主要内容,如果未能解决你的问题,请参考以下文章