aderchox Asked: 2019-05-12 20:34:15 +0800 CST2019-05-12 20:34:15 +0800 CST 2019-05-12 20:34:15 +0800 CST 在 bash 中创建持久数组 772 我想在我的 bashrc 文件中有一个关联数组,我想在需要时添加或删除它,但是如果我将数组声明放在 bashrc 文件中,它将在每次运行 bash 时重新声明,因此以前的值将丢失. 我应该怎么办? bash shell-script 1 个回答 Voted Best Answer mosvy 2019-05-12T21:34:41+08:002019-05-12T21:34:41+08:00 我认为没有什么好的方法可以做到这一点。您必须手动进行反序列化、保存和恢复。示例代码: save_array(){ declare -n a=$1 for i in "${!a[@]}"; do printf '%s\0%s\0' "$i" "${a[$i]}"; done } restore_array(){ unset $1; declare -gA $1 declare -n a=$1; local k v while read -d '' k && read -d '' v; do a[$k]=$v; done } 或者更简单的变体,它利用declare -p[1] 的格式: save_array(){ declare -p $1; } restore_array(){ local l; read -r l; eval "${l/-A*=(/-gA $1=(}"; } 然后: $ declare -A a1; a1[foo]=bar; a1[baz]=qux $ save_array a1 >/tmp/save $ restore_array a2 </tmp/save $ echo "${!a2[@]} // ${a2[@]}" baz foo // qux bar /内置似乎不支持关联数组,也不使用 NUL 字节作为分隔符readarray。mapfile此外,bash似乎无法将数组绑定到数据库,perl就像tie %hash, 'DB_File', $filename, .... [1] 根据您的使用情况,您可以使其更简单: #! /bin/bash trap 'declare -p a1 a2 > ./path/to/saved_arrays' EXIT . ./path/to/saved_arrays 2>/dev/null || declare -A a1 a2 a1[$1]=$2 a2[$2]=$1
我认为没有什么好的方法可以做到这一点。您必须手动进行反序列化、保存和恢复。示例代码:
或者更简单的变体,它利用
declare -p
[1] 的格式:然后:
/内置似乎不支持关联数组,也不使用 NUL 字节作为分隔符
readarray
。mapfile
此外,bash
似乎无法将数组绑定到数据库,perl
就像tie %hash, 'DB_File', $filename, ...
.[1] 根据您的使用情况,您可以使其更简单: