web-dev-qa-db-fra.com

Exportation de JSON vers des variables d'environnement

Si j'ai un JSON comme ça, 

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

Et je veux exporter chacune de ces paires clé-valeur en tant que variables d'environnement, comment le faire via un script Shell? Ainsi, par exemple, lorsque j'écris sur le terminal, echo $hello1, world1 devrait être imprimé et de la même manière pour d'autres paires clé-valeur? Remarque: Le JSON ci-dessus est présent dans une variable appelée $values et non dans un fichier. 

Je sais que ce sera fait via jq et écrit un script Shell pour cela, mais cela ne fonctionne pas.

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

Edit: Essayer la réponse de Turn, j'ai fait ceci: 

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

En empruntant à cette réponse qui fait tout le travail de conversion du JSON en paires clé = valeur, vous pouvez les insérer dans l'environnement en effectuant une boucle sur la sortie jq et exporting:

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

L’approche illustrée par le script Shell suivant évite la plupart des problèmes (mais pas tous) avec les caractères spéciaux:

#!/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"

Notez que ce qui précède suppose qu'il n'y a pas d'onglets dans les clés elles-mêmes.

1
peak

Utilisation de la substitution de commande $():

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

Edit: Répondre à this comment

Tu devrais faire

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

Faites attention aux citations double autour de $values

Remarque: Impossible de confirmer si cette approche implique des problèmes de sécurité, si l'utilisateur pouvait manipuler la variable json pour causer des dégâts.

0
sjsam

Pour ce faire, vous pouvez utiliser jq, un processeur JSON de ligne de commande léger et flexible.

Supposons que vos variables d'environnement se trouvent dans un fichier appelé environment.json, comme suit:

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

Vous pouvez utiliser le script suivant pour les exporter:

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

Vous pouvez vérifier que vos variables ont été ajoutées en utilisant:

printenv

ou

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