Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从shell脚本修改INI文件?_Shell_Debian_Packaging_Ini - Fatal编程技术网

如何从shell脚本修改INI文件?

如何从shell脚本修改INI文件?,shell,debian,packaging,ini,Shell,Debian,Packaging,Ini,我正在构建一个vnc的定制包,并希望确保在包安装后脚本中启用GDM的xdcmp设置。gdm.conf文件是ini样式的文件,即: [section] var=name 我要设置的值在整个配置文件的不同部分有名称冲突 是否有任何方法或工具允许从shell脚本轻松操纵ini样式的配置文件 我想在.debpostinst脚本中对此进行分类。如果您想编写一些Perl,可以使用配置::ini文件(packagelibconfig ini文件Perl)。看看crudini包。它设计用于使用Ex编辑器从sh

我正在构建一个vnc的定制包,并希望确保在包安装后脚本中启用GDM的xdcmp设置。
gdm.conf
文件是ini样式的文件,即:

[section]
var=name
我要设置的值在整个配置文件的不同部分有名称冲突

是否有任何方法或工具允许从shell脚本轻松操纵ini样式的配置文件


我想在
.deb
postinst脚本中对此进行分类。

如果您想编写一些Perl,可以使用
配置::ini文件
(package
libconfig ini文件Perl
)。

看看crudini包。它设计用于使用Ex编辑器从shell命令操作ini文件(更改
var
键的值):

要支持INI部分,请使用以下语法:

ex +':/\[section\]/,$s/var=\zs.*/new_name/' -scwq config.ini
有关从INI文件读取值的信息,请参见:


以下是有助于编辑INI值(不支持部分)的shell函数:

以下是用于读取INI值的shell函数(不支持部分):


例如,
ini\u get var

我得出结论,perl是最简单的解决方案。Debian打包指南似乎并不禁止perl用于配置脚本,尽管我怀疑仅仅为了安装软件包而添加对perl的依赖将意味着这将永远不会向上游发展。@stsquad:perl本身不是问题,它被正式批准用于Debian软件包脚本(例如,您可以看到,
perl base
是必不可少的,而
debconf
提供了perl模块)。必须预先依赖
libconfig文件perl
可能是一个更大的障碍。
ex +':/\[section\]/,$s/var=\zs.*/new_name/' -scwq config.ini
# Set value in the INI file.
# Usage: ini_set [key] [value] [file]
ini_set()
{
  local key="$1"
  local value="$2"
  local file="$3"
  [ -f "$file" ]
  if [ -n "$value" ]; then
    if grep -q "$key" "$file"; then
      echo "INFO: Setting '$key' to '$value' in $(basename "$file")"
      ex +'%s#'"$key"'=\zs.*$#'"$value"'#' -scwq! "$file"
    else
      echo "$key=$value" >> "$file"
    fi
  else
    echo "WARN: Value for '$key' is empty, ignoring."
  fi
}
# Get value from the INI file.
# Usage: ini_get [key] (file)
ini_get()
{
  local key="$1"
  local file="$2"
  [ ! -s "$file" ] && return
  local value="$(grep -om1 "^$key=\S\+" "$file" | head -1 | cut -d= -f2-)"
  echo "Getting '$key' from $(basename "$file"): $value" >&2
  echo $value
}