2016-07-01 120 views
1

所以我读了bash脚本使用.conf文件的最简单方法,就是使用source来加载这样的文件。现在,如果我想编辑这个文件呢?如何轻松编辑.conf文件?

一些代码,我发现做了很好的工作:

function set_config(){ 
    sed -i "s/^\($1\s*=\s*\).*\$/\1$2/" $conf_file 
} 

但是,如果变量尚未定义,它并没有定义它,也不会检查参数传递很好,不是吗不安全,不处理默认值等...

是否存在可靠的工具/代码来编辑包含key =“value”对的.conf文件?举例来说,我希望能够做这样的事情:

$conf_file="my_script.conf" 
conf_load $conf_file #should create the file if it doesn't exist ! 
read=$(conf_get_value "data" "default_value") #should read the value with key "data", defaulting to "default_value" 
if [[ $? = 0 ]] #we should be able to know if the read was successful 
then 
    echo "Successfully read value for field \"data\" : $read" 
else 
    echo "Default value for field \"data\" : $read" 
fi 

conf_set "something_new" "a great value!" #should add the key "something_new" as it doesn't exist 
conf_set "data" "new_value" #should edit the value with key "data" 
if [[ $? = 0 ]] 
then 
    echo "Edit successful !" 
else #something went wrong :-/ 
    echo "Edit failed !" 
fi 

运行此代码之前,conf文件将包含

data="some_value" 

后这将是

data="new_value" 
something_new="a great value!" 

和代码应输出

Successfully read value for field "data" : some_value 
Edit successful ! 

我正在使用bash版本4.3.30。 感谢您的帮助。

+0

你能给我们一些例子之前和之后的数据? –

+0

@Llama先生编辑这个问题,使其更清晰 – Magix

回答

1

我倒是要与awk,因为它是相当不错的,在标记化:

# overwrite config's entries for KEY with VALUE or else appends the definition 
# Usage: set_config KEY VALUE 
set_config() { 
    [ -n "$1" ] && awk -F= -v key="$1" -v new="$1=\"$2\"" ' 
    $1 == key { $0 = new; key_found = 1; } 
    { print } 
    END { if (!key_found) { print new; } 
    ' "$conf_file" > "$conf_file.new" \ 
    && cat "$conf_file.new" > "$conf_file" && rm "$conf_file.new" 
} 

如果不带参数运行,set_config()将什么也不做,返回false。如果仅使用一个参数运行,它将创建一个空值(输出KEY="")。

awk命令逐行解析.conf文件,查找给定键的每个定义并将其更改为新值。然后打印所有行(修改或不修改),保留原始顺序。如果在文件末尾还没有找到密钥,则会附加新的定义。

因为无法在本身上传输文件,所以会以“.new”扩展名保存,然后以保留权限的方式复制到原始文件上。然后删除“.new”副本。我使用&&来确保如果在函数的前面发生错误,这些永远不会发生。

还要指出的是“.conf文件”类型你指的是永远不会有围绕其等号的空间,所以\s*部分的sed命令都没有(你用POSIX壳源型)需要。

+0

这看起来像一个非常好的开始,它是否包含特殊字符等值的安全? 如果只传递一个参数会发生什么? – Magix

+0

我没有把条件放在太少的论据。零参数将在文件末尾添加一个裸等号,并在文件来源时创建错误。一个参数(或一个空白的第二个参数)只会将该键定义为一个空字符串。特殊字符可以正常工作,但传递给'set_config()'函数时必须引用它们。 –

+0

是否区分大小写?这种行为可以改变吗? 如果在bash中还没有这样的功能性,那么从它制作一个软件包会是一个好主意吗? – Magix

相关问题