Wenn ich eine solche JSON habe,
{
"hello1": "world1",
"testk": "testv"
}
Und ich möchte jedes dieser Schlüsselwertpaare als Umgebungsvariablen exportieren. Wie kann ich das über ein Shell-Skript tun? Wenn ich beispielsweise auf dem Terminal schreibe, sollte echo $hello1
, world1
gedruckt werden und für andere Schlüssel-Wert-Paare ähnlich. Hinweis: Die obige JSON ist in einer Variablen mit dem Namen $values
vorhanden und nicht in einer Datei.
Ich weiß, dass es über jq
gemacht wird und dazu ein Shell-Skript geschrieben hat, aber es funktioniert nicht.
for row in $(echo "${values}" | jq -r '.[]'); do
-jq() {
echo ${row} | jq -r ${1}
}
echo $(_jq '.samplekey')
done
Edit: Versuch Turns Antwort, ich habe folgendes getan:
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
Wenn Sie sich von dieser Antwort leihen, die all die harte Arbeit der Umwandlung von JSON in Schlüssel = Wert-Paare erledigt, könnten Sie diese in die Umgebung bringen, indem Sie die jq
-Ausgabe durchlaufen und export
ing:
for s in $(echo $values | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" ); do
export $s
done
Der durch das folgende Shell-Skript dargestellte Ansatz vermeidet die meisten (aber nicht alle) Probleme mit Sonderzeichen:
#!/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"
Beachten Sie, dass das Obige davon ausgeht, dass sich in den Schlüsseln selbst keine Registerkarten befinden.
Befehlssubstitution verwenden $()
:
# $(jq -r 'keys[] as $k | "export \($k)=\(.[$k])"' file.json)
# echo $testk
testv
Edit: Antworten auf this comment
Du solltest tun
$( echo "$values" | jq -r 'keys[] as $k | "export \($k)=\(.[$k])"' )
Beachten Sie die double
-Anführungszeichen um $values
.
Hinweis: Konnte die Sicherheitsanfälligkeit für diesen Ansatz nicht bestätigen, das heißt, wenn der Benutzer die json
manipulieren könnte, um Verwüstungen zu verursachen.
Um dies zu erreichen, können Sie jq
verwenden, einen leichtgewichtigen und flexiblen Befehlszeilen-JSON-Prozessor.
Nehmen wir an, Sie haben Ihre Umgebungsvariablen in einer Datei mit dem Namen environment.json
wie folgt:
# environment.json
{
"hello1": "world1",
"testk": "testv"
}
Sie können das folgende Skript verwenden, um sie zu exportieren:
for s in $(jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" environment.json); do
export $s
done
Sie können überprüfen, ob Ihre Variablen hinzugefügt wurden, indem Sie Folgendes verwenden:
printenv
oder
echo $VARIABLE_NAME # use the name of your environment variables instead