cleanest/easiest 读取配置文件的方法是什么
What is the cleanest/easiest way to read in a config file
我想在分组中创建一个包含键=值对的配置文件,以便我可以在键=值对组中循环访问配置文件。
示例配置文件:
#group1
var1=test1
var2=test2
var3=test3
#group2
var1=text4
var2=text5
var3=test6
var4=test7
#group3
var3=test8
是否有一种简单的方法来解析类似于此布局的配置文件,其中每个组可以 include/exclude 参数,并且解析循环的每次迭代都会引入特定组的键=值对?
bash 是否有内置的配置解析器?这是一个 openrc 初始化脚本。
您可以使用命令 cut
使用等号 =
作为分隔符
如果 $line
是每个有效行,(您可以转义以注释和空行开头的行)
key=`cut -f1 -d '=" $line`
value=`cut -f2 -d '=" $line`
根据 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]
我想在分组中创建一个包含键=值对的配置文件,以便我可以在键=值对组中循环访问配置文件。
示例配置文件:
#group1
var1=test1
var2=test2
var3=test3
#group2
var1=text4
var2=text5
var3=test6
var4=test7
#group3
var3=test8
是否有一种简单的方法来解析类似于此布局的配置文件,其中每个组可以 include/exclude 参数,并且解析循环的每次迭代都会引入特定组的键=值对?
bash 是否有内置的配置解析器?这是一个 openrc 初始化脚本。
您可以使用命令 cut
使用等号 =
作为分隔符
如果 $line
是每个有效行,(您可以转义以注释和空行开头的行)
key=`cut -f1 -d '=" $line`
value=`cut -f2 -d '=" $line`
根据 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]