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​​perltie %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

관련 정보