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



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

我的bash版本是:

GNU bash, Version 5.0.3(1)-release 

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

#!/bin/bash
testFunction() {
local -n out_ref="$1"
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 "$1",以便将employee声明为全局变量。

在没有declare -A employee的情况下,employee基本上被视为一个普通的索引数组。在该上下文中,nameemployee都是在算术上下文中计算的未定义变量,因此两者的计算结果都为0。

我不完全确定local -n是如何实现的(local -nA不允许将引用标记为关联数组(;真实的";要分配给的关联数组,employee的值就是分配给引用out_ref任意键的最后一个值。(可能与上面相同:在算术上下文中,namecompany的求值结果都为0,因此您要向out_ref[0]赋值两次(因为out_ref没有引用标记名称的数组,所以您只向out_ref本身赋值。(

在这些优秀人才所提供的基础上,这里有一个实际使用的功能示例。

A() {
declare -Ag "$1"
local -n ref="$1"
ref[A]='in A'
}
B() {
declare -Ag "$1"
local -n ref="$1"
ref[B]='in B'
}
A foo
B foo
declare -p foo

保存并执行为一个名为tst的文件,下面是运行和输出-

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

注意";重新声明";在多个函数中全局变量的不影响数据完整性。

最新更新