it-swarm.com.ru

Экспорт JSON в переменные среды

Если у меня есть JSON, как это, 

{
    "hello1": "world1",
    "testk": "testv"
}

И я хочу экспортировать каждую из этих пар ключ-значение в качестве переменных среды, как это сделать с помощью сценария оболочки? Так, например, когда я пишу на терминале, должны быть напечатаны echo $hello1, world1 и аналогично для других пар ключ-значение? Примечание. Приведенный выше JSON присутствует в переменной с именем $values, а не в файле. 

Я знаю, что это будет сделано через jq и написал для этого сценарий Shell, но это не работает.

for row in $(echo "${values}" | jq -r '.[]'); do
    -jq() {
        echo ${row} | jq -r ${1}
    }
    echo $(_jq '.samplekey')
done

Правка: пытаясь ответить Терна, я сделал это: 

values='{"hello1":"world1","hello1.world1.abc1":"hello2.world2.abc2","testk":"testv"}'
for s in $(echo $values | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" ); do
    export $s
done
4
Qirohchan

Заимствуя из этот ответ который выполняет всю тяжелую работу по превращению JSON в пары ключ = значение, вы можете получить их в среде, зацикливая вывод jq и exporting их:

for s in $(echo $values | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" ); do
    export $s
done
9
Turn

Подход, проиллюстрированный следующим сценарием Shell, позволяет избежать большинства (но не всех) проблем со специальными символами:

#!/bin/bash

function json2keyvalue {
   cat<<EOF | jq -r 'to_entries|map("\(.key)\t\(.value|tostring)")[]'
{
    "hello1": "world1",
    "testk": "testv"
}
EOF
}

while IFS=$'\t' read -r key value
do
    export "$key"="$value"
done < <(json2keyvalue)

echo hello1="$hello1"
echo testk="$testk"

Обратите внимание, что приведенное выше предполагает, что в самих клавишах нет вкладок.

1
peak

Использование подстановки команд $():

# $(jq -r 'keys[] as $k | "export \($k)=\(.[$k])"' file.json)
# echo $testk
testv

Правка: Отвечая на это комментарий

Ты должен сделать

$( echo "$values" | jq -r 'keys[] as $k | "export \($k)=\(.[$k])"' )

Просто обратите внимание на double цитаты вокруг $values

Примечание: Не удалось подтвердить, есть ли последствия для безопасности в этом подходе, то есть если пользователь может манипулировать json, чтобы нанести ущерб.

0
sjsam

Для этого вы можете использовать jq, который является легким и гибким процессором командной строки JSON.

Допустим, у вас есть переменные окружения в файле с именем environment.json следующим образом:

# environment.json
{
    "hello1": "world1",
    "testk": "testv"
}

Вы можете использовать следующий скрипт для их экспорта:

for s in $(jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" environment.json); do
    export $s
done

Вы можете проверить, что ваши переменные были добавлены с помощью:

printenv

или же

echo $VARIABLE_NAME # use the name of your environment variables instead
0
lmiguelvargasf