如何轻松编辑.conf文件?

时间:2016-07-01 15:35:46

标签: bash security config configuration-files

所以我读到使用bash脚本的.conf文件的最简单方法是使用source来加载这些文件。现在,如果我想编辑这个文件怎么办?

我发现的一些代码确实做得很好:

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。 谢谢你的帮助。

1 个答案:

答案 0 :(得分: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文件”类型(使用POSIX shell提供的类型)在其等号周围不会有空格,因此\s*部分sed部分不需要1}}命令。