【问题标题】:How can I edit a .conf file easily?如何轻松编辑 .conf 文件?
【发布时间】:2016-07-01 15:35:46
【问题描述】:

因此,我阅读了将 .conf 文件用于 bash 脚本的最简单方法是使用 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 。 感谢您的帮助。

【问题讨论】:

  • 你能给我们举一些数据前后的例子吗?
  • @Mr.Llama 编辑问题以使其更清晰

标签: bash security config configuration-files


【解决方案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 获取的类型)的等号周围永远不会有空格,因此您的 sed 命令的 \s* 部分不需要。

【讨论】:

  • 这看起来是一个很好的开始,对于包含特殊字符等的值是否安全...?如果只传递一个参数会发生什么?
  • 我没有设置参数太少的条件。零参数将在文件末尾添加一个裸等号,并在获取文件时产生错误。一个参数(或空白的第二个参数)只会将键定义为空字符串。特殊字符可以正常工作,但您必须在传递给 set_config() 函数时引用它们。
  • 区分大小写吗?这种行为可以改变吗?如果 bash 中还不存在这样的功能,那么用它制作一个包是个好主意吗?
  • 这段代码确实区分大小写。 Shell 变量是区分大小写的,所以你想坚持下去,但如果你真的想改变它,你可以用tolower($1) == tolower(key) 代替上面的$1 == key
  • 我已经编辑了代码以拒绝空参数并接受单个参数作为给定键对空值的分配(如现在在描述中所述)。我还在 conf 文件中添加了引号,否则你会遇到间隔值的问题。
猜你喜欢
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2013-12-17
  • 1970-01-01
相关资源
最近更新 更多