2016-07-01 4 views
1

Итак, я прочитал самый простой способ использовать файлы .conf для сценариев bash, чтобы использовать source для загрузки таких файлов. Теперь, если я хочу отредактировать этот файл?Как я могу легко редактировать файл .conf?

Некоторые код, который я нашел делает очень хорошую работу:

function set_config(){ 
    sed -i "s/^\($1\s*=\s*\).*\$/\1$2/" $conf_file 
} 

Но, если переменная еще не определена, она не определяет его, и не проверить, если прошло хорошо параметры, ISN 't secure, не обрабатывает значения по умолчанию и т. д.

Есть ли надежные инструменты/код для редактирования файла .conf, которые содержат пары key = "value"? Например, я хотел бы быть в состоянии сделать что-то вроде этого:

$conf_file="my_script.conf" 
conf_load $conf_file #should create the file if it doesn't exist ! 
read=$(conf_get_value "data" "default_value") #should read the value with key "data", defaulting to "default_value" 
if [[ $? = 0 ]] #we should be able to know if the read was successful 
then 
    echo "Successfully read value for field \"data\" : $read" 
else 
    echo "Default value for field \"data\" : $read" 
fi 

conf_set "something_new" "a great value!" #should add the key "something_new" as it doesn't exist 
conf_set "data" "new_value" #should edit the value with key "data" 
if [[ $? = 0 ]] 
then 
    echo "Edit successful !" 
else #something went wrong :-/ 
    echo "Edit failed !" 
fi 

перед запуском этого кода, файл конф будет содержать

data="some_value" 

и после того, как он будет

data="new_value" 
something_new="a great value!" 

и код должен выводиться

Successfully read value for field "data" : some_value 
Edit successful ! 

Я использую версию bash 4.3.30. Спасибо за помощь.

+0

Можете ли вы привести нам пример до и после данных? –

+0

@ Mr.Llama Отредактирован вопрос, чтобы сделать его более четким – Magix

ответ

1

Я бы к тому, что с awk, так как это довольно хорошо tokenizing:

# overwrite config's entries for KEY with VALUE or else appends the definition 
# Usage: set_config KEY VALUE 
set_config() { 
    [ -n "$1" ] && awk -F= -v key="$1" -v new="$1=\"$2\"" ' 
    $1 == key { $0 = new; key_found = 1; } 
    { print } 
    END { if (!key_found) { print new; } 
    ' "$conf_file" > "$conf_file.new" \ 
    && cat "$conf_file.new" > "$conf_file" && rm "$conf_file.new" 
} 

Если запускать без аргументов, set_config() ничего не будет делать и возвращать ложь. Если запустить только один аргумент, он создаст пустое значение (вывод KEY="").

Команда awk анализирует файл .conf по строкам, ищет каждое определение данного ключа и изменяет его на новое значение. Затем все строки печатаются (с изменением или без изменений), сохраняя исходный порядок. Если ключ еще не найден в конце файла, это добавляет новое определение.

Поскольку вы не можете перенести файл поверх себя, он сохраняется с расширением «.new», а затем копируется поверх оригинала таким образом, который сохраняет разрешения. Затем «.new» копируется. Я использовал &&, чтобы убедиться, что это никогда не произойдет, если ранее произошла ошибка в функции.

Также обратите внимание, что тип «.conf-файла», на который вы ссылаетесь (тип, который вы используете с оболочкой POSIX), никогда не будет иметь пробелов вокруг его знаков равенства, поэтому \s* частей вашей команды sed не являются необходимо.

+0

Это похоже на очень хороший старт, безопасен ли он для значений, содержащих специальные символы и т. Д.?? Что произойдет, если передан только один аргумент? – Magix

+0

Я не ставил условие для слишком большого количества аргументов. Нулевые аргументы добавят знак равенства в конце файла и будут создавать ошибки при получении файла. Один аргумент (или пустой второй аргумент) будет просто определять ключ как пустую строку. Специальные символы будут работать нормально, хотя вам придется процитировать их при передаче функции 'set_config()'. –

+0

Чувствителен ли к регистру? Можно ли изменить это поведение? Если такая функциональная функция еще не существует в bash, было бы неплохо сделать из нее пакет? – Magix

Смежные вопросы