Что лучший способ состоит в том, чтобы прочитать файл конфигурации в ударе?
Например, Вы имеете сценарий и не готовы заполнить всю конфигурацию вручную каждый раз, когда Вы называете сценарий.
Редактирование 1: Я думаю, что не прояснил, таким образом: то, что я хочу... У меня есть configfile, который похож
variable_name value
variable_name value ...
и я хочу считать это. Я знаю, что мог просто grep он для аргументов, которые я ищу или так..., но возможно существует более интеллектуальный путь :)
Поскольку 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"
, но это более опасно, чем определение источника сценария. Вы могли непреднамеренно повредить это более легко, чем полученный файл.)
Очевидно, я не 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?
, Конечно, в реальном прикладном сценарии, необходимо добавить много материала, чтобы удостовериться, что аргументы корректны, решают, что сделать, когда введенный является неправильным, файл настроек не существует и т.д., но:
Это - основная идея
Используйте source
или .
для загрузки в файле.
source /path/to/file
или
. /path/to/file
также рекомендуется проверить, существует ли файл прежде, чем загрузить его, потому что Вы не хотите продолжать запускать свой скрипт, если конфигурационный файл не присутствует.
Я использую этого...
#!/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 файле будет удален (включая # или; комментарий и другой)
знать, что однострочные команды оболочки могут быть также оценены из этого файла конфигурации!
#------------------------------------------------------------------------------
# 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