在bash中传递关联数组的两种方法
对于普通的bash索引数组,请参见我的另外两个答案这里(通过引用)和这里(通过值)。要打印数组的值或引用,请参见我的答案这里。
1. 手动传递(通过序列化/反序列化)关联数组
还有一种方法:您可以在将关联数组传递给函数时手动序列化关联数组,然后在函数内部将其反序列化为一个新的关联数组:
以下是来自我的eRCaGuy_hello_world存储库的完整可运行示例:
array_pass_as_bash_parameter_2_associative.sh:
print_associative_array() {
i=1
array_len="${@:$i:1}"
((i++))
declare -A array
for (( i_key="$i"; i_key<$(($i + "$array_len")); i_key++ )); do
i_value=$(($i_key + $array_len))
key="${@:$i_key:1}"
value="${@:$i_value:1}"
array["$key"]="$value"
done
for key in "${!array[@]}"; do
value="${array["$key"]}"
echo " $key: $value"
done
}
declare -A array1
array1["a"]="cat"
array1["b"]="dog"
array1["c"]="mouse"
print_associative_array "${#array1[@]}" "${!array1[@]}" "${array1[@]}"
示例输出:
a: cat
b: dog
c: mouse
解释:
对于一个名为print_associative_array
的函数,其一般形式如下:
print_associative_array array_length array_keys array_values
对于一个名为
array1
的数组,以下是如何获取数组的长度、索引(键)和值的方法:
- 数组长度:
"${#array1[@]}"
- 所有数组索引(在这种情况下是键,因为它是一个关联数组):
"${!array1[@]}"
- 所有数组值:
"${array1[@]}"
因此,调用
print_associative_array
的示例如下:
print_associative_array "${#array1[@]}" "${!array1[@]}" "${array1[@]}"
将数组的
长度放在前面是必要的,因为它允许我们在传入的序列化数组到达
print_associative_array
函数时解析它,该函数位于魔术
@
数组的所有传入参数中。
为了解析
@
数组,我们将使用数组分片,其描述如下(此片段从
此处我的答案中复制粘贴):
echo "${@:2:5}"
2. 【比上面更好的技巧!】通过引用传递数组
...正如Todd Lehman在这里的回答中所解释的那样
print_associative_array2() {
local -n array_reference="$1"
for key in "${!array_reference[@]}"; do
value="${array_reference["$key"]}"
echo " $key: $value"
done
}
echo 'print_associative_array2 array1'
print_associative_array2 array1
echo ""
echo "OR (same thing--quotes don't matter in this case):"
echo 'print_associative_array2 "array1"'
print_associative_array2 "array1"
示例输出:
print_associative_array2 array1
a: cat
b: dog
c: mouse
OR (same thing--quotes don't matter in this case):
print_associative_array2 "array1"
a: cat
b: dog
c: mouse
另请参阅:
- [我的回答] 一个更详细的演示,展示我如何将常规的“索引”bash数组序列化/反序列化,以便将它们作为参数传递给函数:在bash中传递数组作为参数
- [我的回答] 一个演示,展示我如何通过引用传递常规的“索引”bash数组:在bash中传递数组作为参数
- [我的回答] 数组切片:Unix & Linux: Bash: 位置参数的切片
- [我的问题] 为什么
man bash
页面声明declare
和local
的-n
属性“不能应用于数组变量”,但实际上可以?
- [我的回答] 如何在Bash中手动传递关联数组到子进程并返回