Как СОЕДИНИТЬ два JSON в переменных среды?

Основываясь на ответе @Amir , вот сценарий, который генерирует и затем включает библиотеку во время выполнения:

#!/bin/bash
set -euo pipefail

function clean_up {
  trap - EXIT # Restore default handler to avoid recursion
  [[ -e "${isatty_so:-}" ]] && rm "$isatty_so"
}
# shellcheck disable=2154 ## err is referenced but not assigned
trap 'err=$?; clean_up; exit $err' EXIT HUP INT TERM

isatty_so=$(mktemp --tmpdir "$(basename "$0")".XXXXX.isatty.so)
echo "int isatty(int fd) { return 1; }" \
  | gcc -O2 -fpic -shared -ldl -o "$isatty_so" -xc -
# Allow user to SH=/bin/zsh faketty mycommand
"${SH:-$SHELL}" -c 'eval $@' - LD_PRELOAD="$isatty_so" "$@"

1
28.08.2019, 10:48
1 ответ

Ваш пример своеобразен, потому что новое значение полностью заменит старое значение. Исходное значение имеет только один ключ "A", а значение, которое необходимо "объединить", содержит другое значение для ключа "A", которое заменит исходное.

Итак, для иллюстрации я сделаю вид, что вы имели в виду, что эти входные данные должны быть в другом порядке (, так что «Привет, мир» перезапишет «Прощай, мир», а «Это была шутка» останется без изменений. ).

Это можно сделать так:

( echo "{\"A\":\"Goodbye world\", \"B\": \"This was a joke\"}" ; echo "{\"A\":\"Hello world\"}" ) | jq -s add

Суть в том, что вы просто последовательно вводите два объекта json, поэтому вы используете -s, чтобы заставить jqобрабатывать их так, как будто они находятся в массиве; а затем вы просто передаете их фильтру add, который складывает вместе все элементы массива.

Когда объекты добавляются в jq, они объединяются, при этом любые идентичные ключи разрешаются в пользу объекта в правой части операции добавления (, в этом случае последний из двух объектов ).

См. документацию:

1
27.01.2020, 23:30

Теги

Похожие вопросы