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
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 export
ing:
for s in $(echo $values | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" ); do
export $s
done
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.
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.
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