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

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

Правка 1: Я думаю, я не совсем ясно выразился, так что: чего я хочу, так это... У меня есть конфигурационный файл, который выглядит следующим образом

variable_name value  variable_name value ...  

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

Как сказал мбибер, source еще один файл. Например, ваш конфигурационный файл (скажем some.config) было бы:

var1=val1var2=val2

И ваш сценарий может выглядеть следующим образом:

#! /bin/bash# Optionally, set default values# var1="default value for var1"# var1="default value for var2". /path/to/some.configecho "$var1" "$var2"

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

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

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

var1 some value 1var2 some value 2

Тогда вы могли бы сделать что-то вроде:

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

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

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

source /path/to/file

или

. /path/to/file

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

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

Пример

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

#!/bin/bash# argument to set a new string or print the set stringarg=$1# possible string as second argumentstring=$2# path to your config fileconfigfile="$HOME/stringfile"# if the argument is: "set", write the string (second argument) to a fileif [ "$arg" == "set" ]thenecho "$string" > $configfile # if the argunment is "print": print out the set string, as defined in your fileelif [ "$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' printEen aap op een fiets, hoe vind je zoiets?

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

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

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

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

Файл Conf анализируется с помощью sed, а затем вычисляется как простые обозначения переменных

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

Второй sed удаляет пробелы вокруг знака = для допустимого присвоения переменной

Может быть добавлена дальнейшая обработка sed

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

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

<предварительный><код>#------------------------------------------------------------------------------

проанализируйте ini как $0.$host_name.cnf и установите переменные

очищает ненужные данные во время выполнения после выполнения. Обратите внимание на основную часть

любезно предоставлено : http://mark.aufflick.com/blog/2007/11/08/parsing-ini-files-with-sed

#------------------------------------------------------------------------------
doParseConfFile(){
# установите файл
конфигурации cnf по умолчанию cnf_file="$run_unit_bash_dir/$run_unit.cnf"

# однако, если есть файл cnf, зависящий от хоста, переопределите его

test -f “$run_unit_bash_dir/$run_unit.$host_name.cnf”
&& cnf_file="$run_unit_bash_dir/$run_unit.$host_name.cnf"

# но, наконец, переопределите, если передано в качестве аргумента этой функции
# если ini-файл не передан, определите тест ini-файла, независимого от хоста, по умолчанию

-z “$1” || cnf_file=$1;сдвиг 1;

test -z "$2" || ini_section=$2;сдвиг 1;
doLog "ОТЛАДОЧНЫЙ файл конфигурации чтения : $cnf_file"
doLog "ИНФОРМАЦИЯ для чтения раздела [$ini_section] из конфигурационного файла"

# отладочное эхо "@doParseConfFile cnf_file:: $cnf_file"
# может быть позже параметризован ...
test -z "$ini_section" &amp;&amp; ini_section='MAIN_SETTINGS'

доЛог "Чтение ОТЛАДКИ: следующий конфигурационный файл"
доЛог "DEBUG ""$cnf_file"
( set -o posix ; set ) | sort &gt;"$tmp_dir/vars.before"

вычисление sed -e 's/[[:пробел:]]*\=[[:пробел:]]*/=/g' \
    -e 's/#.*$//' \
    -e 's/[[:пробел:]]*$//' \
    -e 's/^[[:пробел:]]*//' \
    - e "s/^\(.*\)=\([^\"']*\)$/\1=\"\2\"/" \
    &lt; $cnf_file \
    | sed -n -e "/^\[$ini_section\]/,/^\s*\[/{/^[^#].*\=.*/ p;}"`

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

doLog "ИНФОРМАЦИЯ добавила следующие переменные из раздела: [$ini_section]"
cmd="$(comm -3 $tmp_dir/vars.перед $tmp_dir/vars.после | perl -ne 's#\s+##g;вывести "\n $_ "' )"
echo -e "$cmd"
echo -e "$cmd" &gt;&gt; $log_file
эхо -e "\n\n"
переход в режим ожидания 1; printf "\033[2J";printf "\033[0;0H" # и очистите экран

}
#eof функция doParseConfFile

Вам нужно будет показать, какую конфигурацию вы имеете в виду. Приведите пример.

See also a very similar question on the Unix & Linux StackExchange.