改进备份和恢复bash字典的功能
我编写了两个简单的函数来备份和恢复bash字典的内容:改进备份和恢复bash字典的功能,bash,dictionary,backup,restore,Bash,Dictionary,Backup,Restore,我编写了两个简单的函数来备份和恢复bash字典的内容: declare -A dikv declare -A dict backup_dikv() { FILE=$1 rm -f $FILE for k in "${!dikv[@]}" do echo "$k,${dikv[$k]}" >> $FILE done } restore_dict() { FILE=$1
declare -A dikv
declare -A dict
backup_dikv()
{
FILE=$1
rm -f $FILE
for k in "${!dikv[@]}"
do
echo "$k,${dikv[$k]}" >> $FILE
done
}
restore_dict()
{
FILE=$1
for i in $(cat $FILE)
do
key=$(echo $i | cut -f 1 -d ",")
val=$(echo $i | cut -f 2 -d ",")
dict[$key]=$val
done
}
# Initial values
dikv=( ["k1"]="v1" ["k2"]="v2" ["k3"]="v3" ["k4"]="v4")
backup_dikv /tmp/backup
restore_dict /tmp/backup
echo "${!dict[@]}"
echo "${dict[@]}"
我的问题是:
谢谢 使用
declare-p
可靠地序列化变量,而不管其类型如何
#/usr/bin/env bash
如果[-f已保存_vars.sh];然后
#还原保存的变量
. 已保存的_vars.sh
其他的
#没有保存的变量,所以让我们填充它们
声明-A dikv=([foo]=“来自dikv的foo bar”[bar]=“来自dikv的bar baz”)
声明-A dict=([baz]=“baz-qux-from dict”[qux]=“qux-corge-from dict”)
fi
#将备份dikv dict序列化到保存的_vars.sh文件中
声明-p dikv dict>'saved_vars.sh'
printf%s\\n“${!dict[@]}”
printf%s\\n“${dict[@]}”
printf%s\\n“${!dikv[@]}”
printf%s\\n“${dikv[@]}”
找到了一种将数组传递给函数的方法,通过这种方式使用local-n:
declare -A dikv
declare -A dict
backup_dictionary()
{
local -n dict_ref=$1
FILE=/tmp/backup
for k in "${!dict_ref[@]}"
do
echo "$k,${dict_ref[$k]}" >> $FILE
done
}
restore_dictionary()
{
local -n dict_ref=$1
FILE=/tmp/backup
for i in $(cat $FILE)
do
key=$(echo $i | cut -f 1 -d ",")
val=$(echo $i | cut -f 2 -d ",")
dict_ref[$key]=$val
done
}
dikv=( ["k1"]="v1" ["k2"]="v2" ["k3"]="v3" ["k4"]="v4")
backup_dictionary dikv
restore_dictionary dict
echo "${!dict[@]}"
echo "${dict[@]}"
仍在试图找到备份和还原内容的最方便方法。您不能将数组传递给函数。您可以将数组的名称传递给函数,然后使用
${!name}
访问数组。一种可能的方法是格式化数组,以便以后可以使用eval
重新创建数组。但是,必须注意键或值中对shell具有特殊意义的字符,例如单撇号。也许最安全的方法是将键值对写入一个文件,方法是用NUL字节(我能想到的唯一安全分隔符)分隔它们,然后从这个表示中重新创建它。declare-p dikv
应该打印一些可以eval
ed重新创建数组的内容,但它并不总是正确处理索引中的奇怪字符。我不确定是否理解这一点,我运行您的脚本并始终生成一个保存的_vars.sh,其中包含以下内容:declare-a dikv declare-a dict您确定要运行bash而不是其他shell吗?$bash-version 5.0.17(1)-release(x86_64-pc-linux-GNU)版权(C)2019免费软件基金会,LICECIA GPLV3+:GPL de GNU版本3后