如何将数组传递给 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 -ndeclare -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 函数?的主要内容,如果未能解决你的问题,请参考以下文章

使用 argparse 将多个 bash 数组传递给 Python

在bash中将数组作为参数传递

如何将数组传递给函数?

如何将二维数组传递给函数[重复]

如何将数组传递给构造函数或类?

如何将函数中使用的数组传递给动态分配的main数组?