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バイトを区切り文字として使用しません。またbashperltie %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

関連情報