如何将数组传递给Bash函数?

时间:2017-01-19 00:21:09

标签: arrays bash function quotes

我有一个Bash脚本,我无法弄清楚如何引用变量。 任何帮助将不胜感激。

此代码完美无缺:

myfunction() {
    for i in "${BASE_ARRAY[@]}"
    do

我想将数组的名称作为变量传递给函数,以便我可以将其与其他数组一起使用。这是我尝试失败的代码:

myfunction() {
    for i in "${$1[@]}"
    do

然后我将以下内容传递给函数:

myfunction BASE_ARRAY

2 个答案:

答案 0 :(得分:7)

我从未成功将数组传递给函数。

对我来说,这两个选项总是将 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[]

传统的将数组内容传递给函数的方法已经多次在StackOverflow中进行了描述,几乎没有提到;你可以毫无困难地找到例子。

答案 1 :(得分:4)

试试这个:

myfunction() {
    local x="$1[@]"
    for i in "${!x}"
    do

Bash中的间接引用看起来像"${!VARIABLE_CONTAINING_NAME_TO_EXPAND}"。对于非数组的变量,它很简单。

但是当你需要访问数组中的项目(或者你的情况下的所有项目)时,你需要将整个引用放在要扩展的变量中。