在 bash 中创建持久数组

在 bash 中创建持久数组

我想要在 bashrc 文件中添加一个关联数组,并且希望在需要时添加或删除它,但是如果我将数组声明放在 bashrc 文件中,那么每次运行 bash 时都会重新声明它,因此之前的值将会丢失。我应该怎么办?

答案1

我不认为有什么好的方法可以做到这一点。您必须手动进行反序列化、保存和恢复。示例代码:

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

readarray/内置mapfile似乎不支持关联数组,也不使用 NUL 字节作为分隔符。另外,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

相关内容