我正在寻找一个类似于Pythons的ConfigParser
或Perl的Config::INI
的shell脚本。我过去曾获取文件来完成此操作,但我宁愿阅读而不是执行我的"配置文件"。有谁知道任何可与上述可用于 shell(或 bash)脚本的模块相媲美的东西?
你不想获取它,所以你应该:
1.阅读配置,2.验证行 3.评估它们
CONFIGFILE="/path/to/config"
echo "=$ADMIN= =$TODO= =$FILE=" #these variables are not defined here
eval $(sed '/:/!d;/^ *#/d;s/:/ /;' < "$CONFIGFILE" | while read -r key val
do
#verify here
#...
str="$key='$val'"
echo "$str"
done)
echo =$ADMIN= =$TODO= =$FILE= #here are defined
配置文件示例
ADMIN: root
TODO: delete
var=badly_formtatted_line_without_colon
#comment
FILE: /path/to/file
如果你运行上面的示例应该得到(未测试):
== == ==
=root= =delete= =/path/to/file=
当然这不是最好的解决方案 - 也许有人发布了更好的解决方案。
您可能想看看cfget
可以与 sudo apt-get install cfget
一起安装。
#!/bin/bash
# Author: CJ
# Date..: 01/03/2013
## sample INI file save below to a file, replace "^I" with tab
#^I [ SECTION ONE ]
#TOKEN_TWO^I ="Value1 two "
#TOKEN_ONE=Value1 One
#TOKEN_THREE=^I"Value1^I three" # a comment string
#TOKEN_FOUR^I=^I"^IValue1 four"
#
#[SECTION_TWO]
#TOKEN_ONE=Value1 One ^I^I^I# another comment string
#TOKEN_TWO^I ="Value1 two "
#TOKEN_THREE=^I"Value1^I three"
#TOKEN_FOUR^I=^I"^IValue1 four"
## sample INI file
export INI= # allows access to the parsed INI values in toto by children
iniParse() {
# Make word separator Linefeed(n)
OIFS="${IFS}"
IFS=$(echo)
SECTION=_
while read LINE; do {
IFS="${OIFS}"
# Skip blank lines
TMP="$(echo "${LINE}"|sed -e "s/^[ t]*//")"
if [ 0 -ne ${#TMP} ]; then
# Ignore comment lines
if [ '#' == "${LINE:0:1}" -o '*' == "${LINE:0:1}" ]; then
continue
fi # if [ '#' == "${LINE:0:1}" -o '*' == "${LINE:0:1}" ]; then
# Section label
if [ "[" == "${LINE:0:1}" ]; then
LINE="${LINE/[/}"
LINE="${LINE/]/}"
LINE="${LINE/ /_}"
SECTION=$(echo "${LINE}")_
else
LINE="$(echo "${LINE}"|sed -e "s/^[ t]*//")"
LINE="$(echo "${LINE}"|cut -d# -f1)"
TOKEN="$(echo "${LINE:0}"|cut -d= -f1)"
EQOFS=${#TOKEN}
TOKEN="$(echo "${TOKEN}"|sed -e "s/[ t]*//g")"
VALUE="${LINE:${EQOFS}}"
VALUE="$(echo "${VALUE}"|sed -e "s/^[ t=]*//")"
VALUE="$(echo "${VALUE}"|sed -e "s/[ t]*$//")"
if [ "${VALUE:0:1}" == '"' ]; then
echo -n "${SECTION}${TOKEN}=${VALUE}"
echo -e "r"
else
echo -n "${SECTION}${TOKEN}=""${VALUE}"""
echo -e "r"
fi # if [ "${VALUE:0:1}" == '"' ]; then
fi # if [ "[" == "${LINE:0:1}" ]; then
fi # if [ 0 -ne ${#TMP} ]; then
IFS=$(echo)
} done <<< "$1"
IFS="${OIFS}" # restore original IFS value
} # iniParse()
# call this function with the INI filespec
iniReader() {
if [ -z "$1" ]; then return 1; fi
TMPINI="$(<$1)"
TMPINI="$(echo "${TMPINI}"|sed -e "s/r//g")"
TMPINI="$(echo "${TMPINI}"|sed -e "s/[ t]*[[ t]*/[/g")"
TMPINI="$(echo "${TMPINI}"|sed -e "s/[ t]*][ t]*/]/g")"
INI=`iniParse "${TMPINI}"`
INI="$(echo "${INI}"|sed -e "s/r/n/g")"
eval "${INI}"
return 0
} # iniReader() {
# sample usage
if iniReader $1 ; then
echo INI read, exit_code $? # exit_code == 0
cat <<< "${INI}"
cat <<< "${SECTION_ONE_TOKEN_FOUR}"
cat <<< "${SECTION_ONE_TOKEN_THREE}"
cat <<< "${SECTION_TWO_TOKEN_TWO}"
cat <<< "${SECTION_TWO_TOKEN_ONE}"
else
echo usage: $0 filename.ini
fi # if iniReader $1 ; then
grep
的替代方案似乎更具可读性:
CONFIG_FILE='/your/config/file.ini'
eval $(grep '^[|^#' CONFIG_FILE -v | while read line
do echo $line
done)
哪里:
-
-v
grep 选项表示排除匹配的行 -
^[|^#
选择所有以[
或#
开头的行(配置解析器部分和注释)
仅当您的配置文件周围没有空格时,它才会起作用=
(如果您想使用 Python 生成配置,请使用space_around_delimiters=False
https://docs.python.org/3/library/configparser.html#configparser.ConfigParser.write)
支持的配置示例:
FIRST_VAR="a"
[lines started with [ will be ignored]
secondvar="b"
# some comment
anotherVar="c"
您可以使用 bash it-self 来解释 ini 值,方法是:
$ source <(grep = file.ini)
示例文件:
[section-a]
var1=value1
var2=value2
查看更多示例:如何在 shell 脚本中获取 INI 值?
或者你可以使用bash ini-parser,它可以在Old School DevOps博客网站上找到。