如何在 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 employee
,employee
基本上被当作一个普通的索引数组。在这种情况下,name
和 employee
都是在算术上下文中计算的未定义变量,因此它们的计算结果都是 0。
我不完全确定 local -n
是如何实现的(local -nA
不允许将引用标记为关联数组),但似乎缺少一个“真正的”关联数组来分配给,employee
的值就是分配给引用 out_ref
的 any 键的最后一个值。 (可能与上面相同:在算术上下文中 name
和 company
的计算结果均为 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" )
请注意,多个函数中全局变量的“重新声明”并不影响数据完整性。
有多种方法可以从 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 employee
,employee
基本上被当作一个普通的索引数组。在这种情况下,name
和 employee
都是在算术上下文中计算的未定义变量,因此它们的计算结果都是 0。
我不完全确定 local -n
是如何实现的(local -nA
不允许将引用标记为关联数组),但似乎缺少一个“真正的”关联数组来分配给,employee
的值就是分配给引用 out_ref
的 any 键的最后一个值。 (可能与上面相同:在算术上下文中 name
和 company
的计算结果均为 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" )
请注意,多个函数中全局变量的“重新声明”并不影响数据完整性。