it-swarm.com.de

Exportieren von JSON in Umgebungsvariablen

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
4
Qirohchan

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 exporting:

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

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.

1
peak

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.

0
sjsam

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
0
lmiguelvargasf