Используйте jq для анализа json в формате переменных среды - PullRequest
0 голосов
/ 25 октября 2018

Я хотел бы, чтобы код ниже вывел
KNOCK_KNOCK="Who is there?"

TEST_FILE='{
  "KNOCK_KNOCK": "Who is there?"
}'
for s in $(echo $TEST_FILE | jq -r "to_entries|map(\"\ 
(.key)=\(.value|tostring)\")|.[]" ); do
    echo $s
done

Я получил цикл из этого поста: Экспорт JSON в переменные окружения

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

Для следующего теста я получаю ожидаемые результаты:

TEST_FILE='{
  "KNOCK_KNOCK": "Whoisthere?",
  "POSTGRES_URI": "postgress://user:pass@testdb.com",
  "WILL": "I.AM"
}'
for s in $(echo $TEST_FILE | jq -r "to_entries|map(\"\(.key)=\ 
(.value|tostring)\")|.[]" ); do
    echo $s
done

KNOCK_KNOCK=Whoisthere?
POSTGRES_URI=postgress://user:pass@testdb.com
WILL=I.AM

Я выбрал следующее решение, которое работает дляя, но принятый ответ в порядке.

TEST_FILE='{
  "KNOCK_KNOCK": "Who is there?"
}'
echo $TEST_FILE | sed 's_[{}]__'| sed 's_: _=_' | sed 's_  _export _'

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Одна из многих возможностей:

jq -r 'to_entries[] | [.key,.value] | join("=")' <<< "$TEST_FILE"

Вероятно, было бы целесообразно также использовать @sh:

$ echo $'{"KNOCK_KNOCK": "Who \'is\' there?"}'
  | jq -r 'to_entries[] | [.key,(.value|@sh)] | join("=")'
KNOCK_KNOCK='Who '\''is'\'' there?'

$ KNOCK_KNOCK='Who '\''is'\'' there?'
$ echo "$KNOCK_KNOCK"
Who 'is' there?
$ 

Обратите внимание, что если вы собираетесь использовать $TEST_FILE, двойные кавычки могут быть необходимы.

0 голосов
/ 25 октября 2018

Вы почти получили это, но вы можете сделать это без цикла с этой строкой:

$ echo '{"KNOCK_KNOCK": "Who is there?"}' | jq -r 'to_entries[] | .key + "=\"" + (.value|tostring) + "\""'
KNOCK_KNOCK="Who is there?"

Объяснение

to_entries преобразует ваш объект в массив объектов, подобных этому:

$ echo '{"KNOCK_KNOCK": "Who is there?"}' | jq -r 'to_entries'                   
[
  {
    "key": "KNOCK_KNOCK",
    "value": "Who is there?"
  }
]

Затем вы можете взять каждый элемент массива с помощью [] и использовать поля key и value для простой конкатенации строк, используя оператор +.

...