#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