【问题标题】:How to pass an array into a Bash function?如何将数组传递给 Bash 函数?
【发布时间】:2017-06-03 13:24:42
【问题描述】:

我有一个 Bash 脚本,我不知道如何在其中引用变量。 任何帮助将不胜感激。

这段代码完美运行:

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

我想将数组的名称作为变量传递给函数,这样我就可以在其他数组中重复使用它。这是我尝试失败的代码:

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

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

myfunction BASE_ARRAY

【问题讨论】:

标签: arrays bash function quotes


【解决方案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[]

将数组内容传递给函数的传统方法已在 StackOverflow 上多次描述,几乎不值得一提;你会很容易找到例子。

【讨论】:

  • 这太棒了。我不知道。感谢您再次扩展我的大脑。
  • 这非常好,我敢说,令人兴奋(至少与 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}[@]" 可能更清楚(虽然原始代码完全等价)。
猜你喜欢
  • 2011-12-26
  • 2022-01-01
  • 2014-01-10
  • 2021-10-05
  • 2018-02-13
  • 2013-05-03
  • 2011-11-18
  • 1970-01-01
相关资源
最近更新 更多