Сценарий оболочки для переноса переменных файла конфигурации

#linux #bash #shell #sh

#linux #bash #оболочка #sh

Вопрос:

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

У меня есть файл конфигурации, структурированный для чтения CGI-скриптами и программами на C:

 [Version]
api_version = 10

[Broadcast]
ip = 239.10.10.10
port = 35680

[Transmission]
uuid_long = YES
  

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

Моя мысль состоит в том, чтобы перебрать файл в поисках key = valuen шаблона и выполнить замену в новом файле, но я не уверен, как сделать a, grep который разделил бы это на 2 значения, которые я могу использовать, а затем выполнить a sed , который будет соответствовать ключу и символу новой строки, не знаязначение в новом файле.

Примечание: у меня есть только ‘sh’ для работы, без bash, если это имеет значение. (Встроенная система)

Комментарии:

1. Этот формат называется .ini format . Я предлагаю использовать язык программирования, который способен анализировать и изменять такие файлы. Использование сценария оболочки выглядит для меня хакерским. Например, PHP способен анализировать такие файлы.

2. CGI и C отлично анализируют файл ‘ini’, единственный раз, когда оболочке требуется его проанализировать, — это во время этого процесса обновления, поэтому я бы предпочел не добавлять в стек ничего тяжелого, например PHP. Это встроенная система, поэтому место в памяти очень важно, а PHP — огромная библиотека, когда у вас есть всего несколько тысяч КБ для использования. Спасибо за предложение.

3. Тогда вы могли бы использовать C для этого. C также имеет библиотеку для этого.

4. Вы упомянули sed . У вас есть доступ к awk ? Это проблема awk из учебника.

Ответ №1:

Спасибо за предложение использовать AWK. Я очень слаб в написании сценариев оболочки, поэтому, если есть какие-либо улучшения, которые можно внести, пожалуйста, сообщите.

 #!/bin/sh
# Collect all the keys from the original config file
KEYS=$(awk '{ if ($1 !~ /[[A-Za-z]*]/ amp;amp; $1 != "") print $1, "n" }' /etc/file.conf)
# Loop through they keys replacing the values in the new config file
for KEY in $KEYS
do
        VALUE=$(awk -v key="$KEY" '{ if($1 ~ key) print $3 }' /etc/file.conf)
        sed -i "s/$KEY.*/$KEY = $VALUE/g" /etc/new.file.conf
done