Каков наилучший способ прочитать конфигурационный файл в Bash?
Например, у вас есть скрипт, и вы не хотите заполнять всю конфигурацию вручную каждый раз, когда вы вызываете скрипт.
Изменить 1: я думаю, что я не дал понять, так что я хочу ... У меня есть файл конфигурации, который похож на
variable_name value
variable_name value ...
и я хочу это прочитать. Я знаю, я мог бы просто найти это для аргументов, которые я ищу или около того ... но, возможно, есть более разумный способ :)
Ответы:
Как сказал mbiber,
source
еще один файл. Например, ваш файл конфигурации (скажемsome.config
) будет:И ваш скрипт может выглядеть так:
Многие файлы
/etc/default
обычно служат аналогичными конфигурационными файлами для других сценариев оболочки. Очень распространенный пример из постов здесь/etc/default/grub
. Этот файл используется для установки параметров конфигурации для GRUB, посколькуgrub-mkconfig
это сценарий оболочки, который его получает:Если вам действительно нужно обработать конфигурацию формы:
Тогда вы можете сделать что-то вроде:
(Вы также можете сделать что-то подобное
eval "$var=$value"
, но это более рискованно, чем поиск сценария. Вы можете непреднамеренно нарушить это легче, чем файл с источником.)источник
=
самого начала?/etc/default
- и в основном для хорошего использования. Если ваш невежественный пользователь имеет доступ к конфигурации для чего-либо, работающего от имени пользователя root, это уже безнадежное дело.Очевидно, я не
bash
специалист, но концепция не должна отличаться на каком бы языке вы ни использовали:Пример
В приведенном ниже примере вы можете использовать (очень) базовый сценарий, чтобы задать строку или напечатать строку, как указано в вашем конфигурационном файле:
затем
Чтобы установить строку в ваш конфигурационный файл:
Впоследствии, чтобы распечатать строку, как определено в вашем "configfile":
Конечно, в реальном прикладном скрипте вам нужно добавить много вещей, чтобы убедиться, что аргументы верны, решить, что делать, если ввод неправильный, файл настроек не существует и т. Д., Но:
Это основная идея
источник
Используйте
source
или.
для загрузки в файл.или
Также рекомендуется проверить, существует ли файл перед загрузкой, потому что вы не хотите продолжать запускать ваш скрипт, если файл конфигурации отсутствует.
источник
Я использую этот ...
Conf-файл анализируется с помощью sed, а затем оценивается как простые присвоения переменных
Первые значения ключа синтаксического анализа sed (поддерживает также = в окружении пробелов)
Второй sed удаляет пробелы вокруг знака = для правильного присвоения переменной
Может быть добавлено дальнейшее лечение седом
Весь другой не соответствующий тексту в файле conf будет удален (включая # или; комментарий и прочее)
Имейте в виду, что однострочные команды оболочки также могут быть оценены из этого файла конфигурации!
источник
cat
. Почему вы вызываетеsed
дважды спина к спине? Вы можете цепиsed
команды типа так:sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g'
sed
команда сгенерирует пустой вывод для записей примера файла конфигурации в вопросе. -1.
перенаправление команд и процессов вместо временных переменных для хранения выходных данных. <(sed ... "$CFG_FILE")
eval $(sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g' "$CFG_FILE")
что намного лучше для понимания того, что происходит..
ожидается , что подстановка файла и процесса будет расширена до файла.. <(echo echo foo)
работает так же, как и ожидалось в Bash v4.3.11. В небольших примерах это, вероятно, не будет иметь значения. Я бы предпочел не передавать несколько килобайт через подстановку команд.источник