Чтение файла конфигурации из сценария оболочки - PullRequest
12 голосов
/ 12 мая 2011

Я ищу аналог сценария оболочки для чего-то вроде ConfigParser или Perl Config :: INI. В прошлом я использовал для этого файлы, но я бы предпочел читать, а не выполнять мой «файл конфигурации». Кто-нибудь знает что-либо сопоставимое с вышеупомянутыми модулями, доступными для сценариев оболочки (или bash)?

Спасибо, Джерри

Ответы [ 5 ]

12 голосов
/ 13 мая 2011

Вам не нужен источник, поэтому вы должны:

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=

уверен, что это не лучшее решение - может быть, кто-то опубликовать более хорошее.

4 голосов
/ 20 июня 2014

Возможно, вы захотите взглянуть на cfget, который можно установить с помощью sudo apt-get install cfget.

3 голосов
/ 11 января 2013
#!/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
0 голосов
/ 15 марта 2018
Альтернатива на основе

grep представляется более читабельной:

CONFIG_FILE='/your/config/file.ini'
eval $(grep '^\[\|^#' CONFIG_FILE -v | while read line
  do echo $line
done)

Где:

  • -v Параметр grep означает исключение совпадающих строк
  • ^\[\|^# выбирает все строки, которые начинаются с [ или # (разделы и комментарии configparser)

Это будет работать ТОЛЬКО, если в вашем конфигурационном файле нет пробелов вокруг = (если выхотел бы создать конфигурацию с использованием 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"
0 голосов
/ 01 марта 2015

Вы можете использовать bash it-self для интерпретации значений ini:

$ source <(grep = file.ini)

Пример файла:

[section-a]
  var1=value1
  var2=value2

См. Дополнительные примеры: Как мне получитьЗначение INI в сценарии оболочки?

Или вы можете использовать bash ini-parser, который можно найти по адресу Сайт блога Old School DevOps .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...