如何在 bash 函数中使用对关联数组的 bash 变量引用而不在调用该函数之前声明它?

How to use a bash variable reference to an associative array in a bash function without declaring it before calling that function?

有多种方法可以从 bash 脚本中的函数获取结果,一种是使用引用变量,如 local -n out_ref=",这也是我的首选方法。

我的 bash 版本是:

GNU bash, Version 5.0.3(1)-release 

最近,我的一个 bash 函数需要生成一个关联数组,就像在这个示例代码中一样:

#!/bin/bash

testFunction() {
    local -n out_ref=""

    out_ref[name]="Fry"
    out_ref[company]="Planet Express"
}

declare -A employee
testFunction employee

echo -e "employee[name]: ${employee[name]}"
echo -e "employee[company]: ${employee[company]}"

我将变量 employee 声明为具有 declare -A 的关联数组。

输出为:

employee[name]: Fry
employee[company]: Planet Express

如果我删除行 declare -A employee,输出为:

employee[name]: Planet Express
employee[company]: Planet Express

有没有办法将关联数组的声明移到函数中,这样函数的用户就不需要事先做?

在函数内部使用declare -Ag "",这样你就可以将employee声明为一个全局变量。

没有declare -A employeeemployee基本上被当作一个普通的索引数组。在这种情况下,nameemployee 都是在算术上下文中计算的未定义变量,因此它们的计算结果都是 0。

我不完全确定 local -n 是如何实现的(local -nA 不允许将引用标记为关联数组),但似乎缺少一个“真正的”关联数组来分配给,employee 的值就是分配给引用 out_refany 键的最后一个值。 (可能与上面相同:在算术上下文中 namecompany 的计算结果均为 0,因此您将赋值给 out_ref[0] 两次(并且因为 out_ref 不引用一个数组标记的名称,您只是分配给 out_ref 本身。)

扩展这些更好的头脑所提供的内容,这里有一个实际使用中的功能示例。

A() {
  declare -Ag ""
  local -n ref=""
  ref[A]='in A'
}

B() {
  declare -Ag ""
  local -n ref=""
  ref[B]='in B'
}

A foo
B foo
declare -p foo

作为名为 tst 的文件保存并执行,这里是 运行 和输出 -

$: ./tst
declare -A foo=([A]="in A" [B]="in B" )

请注意,多个函数中全局变量的“重新声明”并不影响数据完整性。