有多种方法可以从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
基本上被视为一个普通的索引数组。在该上下文中,name
和employee
都是在算术上下文中计算的未定义变量,因此两者的计算结果都为0。
我不完全确定local -n
是如何实现的(local -nA
不允许将引用标记为关联数组(;真实的";要分配给的关联数组,employee
的值就是分配给引用out_ref
的任意键的最后一个值。(可能与上面相同:在算术上下文中,name
和company
的求值结果都为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" )
注意";重新声明";在多个函数中全局变量的不影响数据完整性。