Использование awk для анализа файла конфигурации

Я пытаюсь создать команду awk, которая сохраняет весь файл конфигурации в виде переменных.

Файл конфигурации имеет следующую форму (в ключах никогда не бывает пробелов, но могут быть значения):

key=value
key2=value two

И моя команда awk:

$(awk -F= '{printf "declare %s=\"%s\"\n", $1, $2}' $file)

Выполнение этого без внешней подоболочки $(...) приводит к печати именно тех команд, которые я хочу, поэтому мой вопрос не столько о awk, сколько о том, как я могу запускать вывод awk в виде команд.

Команда оценивается как:

declare 'key="value"'

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

declare 'key2="value' two"

Конечно, я не могу удалить кавычки или значения, состоящие из нескольких слов, вызывают проблемы.

Я перепробовал почти все решения, которые смог найти, такие как set -f, eval и system().


person Addison    schedule 09.06.2017    source источник
comment
Если я сделаю eval $(echo k=value two | awk -F= '{printf "declare %s=\"%s\"\n", $1, $2}'), а затем echo $k, он вернет мне value two. Это не работает для вас?   -  person jas    schedule 09.06.2017


Ответы (1)


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

#!/bin/bash

while IFS== read -r k v; do
    declare "$k"="$v"
done < config_file

и источник файла как

$ source script.sh
$ echo "$key"
value
$ echo "$key2"
value two

Если source недоступно явно, POSIX верным способом сделать это будет просто

. ./script.sh
person Inian    schedule 09.06.2017
comment
Команда source была именно тем, что мне было нужно. В итоге я сделал: source <(awk .....), но я уважаю ваш ответ за то, что он не использует ненужные инструменты. - person Addison; 12.06.2017