改进备份和恢复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

我编写了两个简单的函数来备份和恢复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
    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[@]}"
我的问题是:

  • 正如您所看到的,这两个函数非常有限,因为备份(dikv)和恢复(dict)字典的名称是硬编码的。我想将字典作为输入($2)参数传递,但我不知道如何在bash中将字典作为函数参数传递

  • 使用字符串格式(“key”、“value”)将键和值写入文件并解析该字符串格式以恢复字典的这种方法是唯一/最有效的方法吗?您知道备份和恢复字典的更好机制吗


  • 谢谢

    使用
    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后