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

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

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

variable_name value  
variable_name value ...  

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

1
задан 24 February 2017 в 18:42

4 ответа

Очевидно, что я не специалист 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

Then

Чтобы установить строку в ваш config file:
$ '/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 May 2018 в 13:00
  • 1
    спасибо, я просто обновляю вопрос, я думаю, что я не прояснил ... но в простых случаях это будет работать как шарм ofc – IcyIcyIce 9 March 2016 в 00:40

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

source /path/to/file

или

. /path/to/file

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

3
ответ дан 23 May 2018 в 13:00

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

#!/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, а затем оценивается как простые переменные asignments

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

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

Может быть добавлено лечение Futher sed

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

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

0
ответ дан 23 May 2018 в 13:00
  • 1
    Бесполезное использование cat . Почему вы дважды вызываете sed дважды? Вы можете сгруппировать команды sed следующим образом: sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g' – David Foerster 24 February 2017 в 19:16
  • 2
    Кроме того, эта команда sed будет генерировать пустой вывод для записей файла конфигурации образца в вопросе. -1 – David Foerster 24 February 2017 в 19:18
  • 3
    Еще одно возможное улучшение: используйте команду . и перенаправление процесса вместо временных переменных, чтобы удерживать вывод подпроцесса: . <(sed ... "$CFG_FILE") – David Foerster 24 February 2017 в 19:32
  • 4
    Конечно, в моем примере используется ключ = значение, например, файл конфигурации. Лучше практика, чем «ключевое значение». Используя ключ = значение мой пример работает. Я признаю, что цепочки команд sed лучше, но команда source ожидает файл, поэтому мы можем использовать: eval $(sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g' "$CFG_FILE"), что лучше понять, что происходит. – smARTin 27 February 2017 в 18:40
  • 5
    Да, . ожидает, что подстановка файла и процесса будет расширена до файла. . <(echo echo foo) работает так же, как ожидалось в Bash v4.3.11. В небольших примерах это, вероятно, не имеет значения. Однако я бы предпочел не передавать несколько килобайт через подстановку команд. – David Foerster 27 February 2017 в 19:00
[F1]
0
ответ дан 23 May 2018 в 13:00

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

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