linux - 在配置文件中读取最干净/最简单的方法是什么

标签 linux bash configuration-files init

我想在分组中创建一个包含键=值对的配置文件,这样我就可以在键=值对组中迭代配置文件。

示例配置文件:

#group1
var1=test1
var2=test2
var3=test3

#group2
var1=text4
var2=text5
var3=test6
var4=test7

#group3
var3=test8

是否有一种简单的方法来解析类似于此布局的配置文件,其中每个组都可以包含/排除参数,并且解析循环的每次迭代都会引入该特定组的键=值对?

bash 有内置的配置解析器吗?这是一个 openrc 初始化脚本。

最佳答案

基于 this thread 中的答案,你可以这样做:

#! /bin/bash

if [ -f "${HOME}/.${0##*/}" ]; then
    config="${HOME}/.${0##*/}rc"
else
    config="/etc/${0##*/}"
fi

if [ -f "$config" ]; then
    section=global
    while read -r line; do
        if [[ $line =~ ^(#|$) ]]; then continue; fi
        if [[ $line =~ ^\[[[:alpha:]_][[:alnum:]_]*\]$ ]]; then
            section=${line#[}
            section=${section%]}
        elif [[ $line =~ ^[[:alpha:]_][[:alnum:]_]*= ]]; then
            eval "${section}_${line%%=*}"=\${line#*=}
        fi
    done <"$config"
fi

这假定 bash,并像这样解析配置文件:

# comment

global1=gval1
global2=gval2

[section1]
variable_1=value_11
variable_2=value_12

[section2]
variable_1=value_21
variable_2=value_22

它设置在配置文件中命名的变量,名称以节的名称为前缀。忽略注释和空行。

概念验证:

set | egrep '^(global|section)[^=]' | \
while read -r line; do
    key=${line%%=*}   
    eval "val=\${$key}"
    printf '%s = [%s]\n' "$key" "$val"
done

输出:

global_global1 = [gval1]
global_global2 = [gval2]
section1_variable_1 = [value_11]
section1_variable_2 = [value_12]
section2_variable_1 = [value_21]
section2_variable_2 = [value_22]

关于linux - 在配置文件中读取最干净/最简单的方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31195926/

相关文章:

linux - 当通过 X11 转发运行时,nvidia-settings 不会检测 GPU

linux - 将 'here document' 文本 block 编入新文件

javascript - 有没有办法在早午餐中设置智能/动态 'joinTo' 输出文件?

linux - 根据 Linux 内核中的 CONFIG 条目更改代码块

c - Fifo 与客户端/服务器

c - 为什么我的程序不能使用 mkdir 系统调用设置 0777 模式?

linux - 在 linux 内核的上下文中,硬件 "gates"是什么?

linux - 使 bash 区分 Ctrl-<letter> 和 Ctrl-Shift-<letter>

regex - 用 sed 替换控制字符

c# - Umbraco 6 - 读取中央配置设置的 "correct"方式是什么?