Каков наилучший способ чтения конфигурационного файла в 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 и установите переменные
очищает ненужные данные во время выполнения после выполнения. Обратите внимание на основную часть
#------------------------------------------------------------------------------
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" && ini_section='MAIN_SETTINGS'
доЛог "Чтение ОТЛАДКИ: следующий конфигурационный файл"
доЛог "DEBUG ""$cnf_file"
( set -o posix ; set ) | sort >"$tmp_dir/vars.before"
вычисление sed -e 's/[[:пробел:]]*\=[[:пробел:]]*/=/g' \
-e 's/#.*$//' \
-e 's/[[:пробел:]]*$//' \
-e 's/^[[:пробел:]]*//' \
- e "s/^\(.*\)=\([^\"']*\)$/\1=\"\2\"/" \
< $cnf_file \
| sed -n -e "/^\[$ini_section\]/,/^\s*\[/{/^[^#].*\=.*/ p;}"`
( set -o posix ; set ) | sort >"$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" >> $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.