我正在构建一个自定义的 vnc 包,并希望确保在包安装后脚本中启用了 GDM 的 xdcmp 设置。该gdm.conf
文件是一个ini风格的,即:
[section]
var=name
而且我要设置的值在整个配置文件的不同部分中存在名称冲突。
是否有任何方法或工具可以轻松地从 shell 脚本操作 ini 样式的配置文件?
我想在.deb
postinst 脚本中解决这个问题。
看看 crudini 包。它是为从 shell 操作 ini 文件而设计的
如果你愿意写一些 Perl,有Config::IniFiles
(package libconfig-inifiles-perl
)。
使用 Ex 编辑器的 Shell 命令(更改var
键的值):
ex +"%s/^var=\zs.*/new_name/" -scwq config.ini
要支持 INI 部分,请使用以下语法:
ex +':/\[section\]/,$s/var=\zs.*/new_name/' -scwq config.ini
要从 INI 文件中读取值,请参阅:如何在 shell 脚本中获取 INI 值?
这是有助于编辑 INI 值的 shell 函数(不支持部分):
# 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
}
这是读取 INI 值的 shell 函数(不支持部分):
# 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
}
例如ini_get var
。