Лучший способ прочитать файл конфигурации в ударе

Что лучший способ состоит в том, чтобы прочитать файл конфигурации в ударе?
Например, Вы имеете сценарий и не готовы заполнить всю конфигурацию вручную каждый раз, когда Вы называете сценарий.

Редактирование 1: Я думаю, что не прояснил, таким образом: то, что я хочу... У меня есть configfile, который похож

variable_name value  
variable_name value ...  

и я хочу считать это. Я знаю, что мог просто grep он для аргументов, которые я ищу или так..., но возможно существует более интеллектуальный путь :)

23
задан 24 February 2017 в 07:42

5 ответов

Поскольку mbiber сказал, source другой файл. Например, Ваш файл конфигурации (говорят some.config) был бы:

var1=val1
var2=val2

И Ваш сценарий мог быть похожим:

#! /bin/bash

# Optionally, set default values
# var1="default value for var1"
# var1="default value for var2"

. /path/to/some.config

echo "$var1" "$var2"

Много файлов в /etc/default обычно служите конфигурационными файлами для других сценариев оболочки похожим способом. Очень типичный пример из сообщений здесь /etc/default/grub. Этот файл используется для установки параметров конфигурации для GRUB с тех пор grub-mkconfig сценарий оболочки, который получает его:

sysconfdir="/etc"
#…
if test -f ${sysconfdir}/default/grub ; then
  . ${sysconfdir}/default/grub
fi

Если действительно необходимо обработать конфигурацию формы:

var1 some value 1
var2 some value 2

Затем Вы могли сделать что-то как:

while read var value
do
    export "$var"="$value"
done < /path/to/some.config

(Вы могли также сделать что-то как eval "$var=$value", но это более опасно, чем определение источника сценария. Вы могли непреднамеренно повредить это более легко, чем полученный файл.)

38
ответ дан 23 November 2019 в 01:25

Очевидно, я не bash, специалист здесь, но понятие не должен отличаться на любом языке, который Вы используете:

пример

В примере ниже, можно использовать (очень) основной сценарий или для , устанавливает строка, или печать строка, как установлено в файле конфигурации:

#!/bin/bash

# argument to set a new string or print the set string
arg=$1
# possible string as second argument
string=$2
# path to your config file
configfile="$HOME/stringfile"

# if the argument is: "set", write the string (second argument) to a file
if [ "$arg" == "set" ]
then
echo "$string" > $configfile 
# if the argunment is "print": print out the set string, as defined in your file
elif [ "$arg" == "print" ]
then 
echo "$( cat $configfile )"
fi

Затем

  • Для установки строки в файл конфигурации:

    $ '/home/jacob/Bureaublad/test.sh' set "Een aap op een fiets, hoe vind je zoiets?"
    
  • Впоследствии, для распечатывания строки, как определено в "configfile":

    $ '/home/jacob/Bureaublad/test.sh' print
    Een aap op een fiets, hoe vind je zoiets?
    

, Конечно, в реальном прикладном сценарии, необходимо добавить много материала, чтобы удостовериться, что аргументы корректны, решают, что сделать, когда введенный является неправильным, файл настроек не существует и т.д., но:

Это - основная идея

4
ответ дан 23 November 2019 в 01:25

Используйте source или . для загрузки в файле.

source /path/to/file

или

. /path/to/file

также рекомендуется проверить, существует ли файл прежде, чем загрузить его, потому что Вы не хотите продолжать запускать свой скрипт, если конфигурационный файл не присутствует.

4
ответ дан 23 November 2019 в 01:25

Я использую этого...

#!/bin/bash

CFG_FILE=/etc/test.conf
CFG_CONTENT=$(cat $CFG_FILE | sed -r '/[^=]+=[^=]+/!d' | sed -r 's/\s+=\s/=/g')
eval "$CFG_CONTENT"

файл Conf проанализирован с sed и затем оценен как присвоения простой переменной

Первый sed, анализирующий значения ключа (поддержки также = окруженный пробелами)

, 114-секундный sed удаляет пробелы вокруг =, расписываются за присвоение действительной переменной

, обработка Futher sed может быть добавлена

Все прочие не, совпавший текст в conf файле будет удален (включая # или; комментарий и другой)

знать, что однострочные команды оболочки могут быть также оценены из этого файла конфигурации!

0
ответ дан 23 November 2019 в 01:25
#------------------------------------------------------------------------------
# parse the ini like $0.$host_name.cnf and set the variables
# cleans the unneeded during after run-time stuff. Note the MainSection
# courtesy of : http://mark.aufflick.com/blog/2007/11/08/parsing-ini-files-with-sed
#------------------------------------------------------------------------------
doParseConfFile(){
    # set a default cnfiguration file
    cnf_file="$run_unit_bash_dir/$run_unit.cnf"

    # however if there is a host dependant cnf file override it
    test -f "$run_unit_bash_dir/$run_unit.$host_name.cnf" \
    && cnf_file="$run_unit_bash_dir/$run_unit.$host_name.cnf"

    # yet finally override if passed as argument to this function
    # if the the ini file is not passed define the default host independant ini file
    test -z "$1" || cnf_file=$1;shift 1;


    test -z "$2" || ini_section=$2;shift 1;
    doLog "DEBUG read configuration file : $cnf_file"
    doLog "INFO read [$ini_section] section from config file"

    # debug echo "@doParseConfFile cnf_file:: $cnf_file"
    # coud be later on parametrized ...
    test -z "$ini_section" && ini_section='MAIN_SETTINGS'

    doLog "DEBUG reading: the following configuration file"
    doLog "DEBUG ""$cnf_file"
    ( set -o posix ; set ) | sort >"$tmp_dir/vars.before"

    eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
        -e 's/#.*$//' \
        -e 's/[[:space:]]*$//' \
        -e 's/^[[:space:]]*//' \
        -e "s/^\(.*\)=\([^\"']*\)$/\1=\"\2\"/" \
        < $cnf_file \
        | sed -n -e "/^\[$ini_section\]/,/^\s*\[/{/^[^#].*\=.*/p;}"`

    ( set -o posix ; set ) | sort >"$tmp_dir/vars.after"

    doLog "INFO added the following vars from section: [$ini_section]"
    cmd="$(comm -3 $tmp_dir/vars.before $tmp_dir/vars.after | perl -ne 's#\s+##g;print "\n $_ "' )"
    echo -e "$cmd"
    echo -e "$cmd" >> $log_file
    echo -e "\n\n"
    sleep 1; printf "\033[2J";printf "\033[0;0H" # and clear the screen
}
#eof func doParseConfFile
0
ответ дан 23 November 2019 в 01:25

Другие вопросы по тегам:

Похожие вопросы: