Ich versuche, diesen Code auszuführen:
while read Item; do
export environmentVariables="$environmentVariables\n - $Item"
done <<< "$(
cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | "\(.key)=\(.value)"' |
)"
Ich habe eine einfache JSON-Datei unter /LocalSecrets/EnvironmentVariables.json
. Es ist ein einfaches Schlüssel/Wert-Paar-JSON-Objekt:
{
"FirstKey": "FirstValue",
"SecondKey": "SecondValue",
"ThirdKey": "ThirdValue"
}
Und ich möchte sie lesen jq
und sie alle an eine Shell-Variable anhängen, $environmentVariables
wie:
FirstKey=FirstValue
SecondKey=SecondValue
ThirdKey=ThirdValue
Da aber jq
in seinem Befehl doppelte Anführungszeichen erforderlich sind und ich heredoc verwenden muss, um die $environmentVariables
aktuelle Shell in der Schleife beizubehalten, stecke ich fest. Der Code wird nicht ausgeführt und weist syntaktische Fehler auf.
Was soll ich tun? Ich bin auch für andere Lösungen offen.
Antwort1
Eigentlich haben Sie in Ihrem Heredoc korrekt doppelte Anführungszeichen gesetzt. Das letzte |
ist jedoch nicht erforderlich, da es zu einem Syntaxfehler führt.
Die erste Parameterzuweisung gibt Ihnen eine zusätzliche neue Zeile, aber das Folgende sollte funktionieren. Verwenden Sie heredoc:
while read item; do
export environmentVariables="$environmentVariables\n$item"
done <<< "$(
cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | [.key, .value] | join("=")'
)"
Dasselbe, aber mit Prozesssubstitution:
while read item; do
export environmentVariables="$environmentVariables\n$item"
done < <(cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | [.key, .value] | join("=")')
<(commands)
IstProzesssubstitution, das Ergebnis der Befehlsausführung erscheint als spezieller Dateiname und wird while
mit einer einfachen Eingabeumleitung übergeben <
.
Alternativ können Sie ein einfaches Pipe-Zeichen verwenden, die Shell jedoch anweisen, ihr letztes Element () in der aktuellen Shell-Umgebung auszuführen while
, sodass Ihr Variablenwert erhalten bleibt:
shopt -s lastpipe
cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | [.key, .value] | join("=")' |
while read item
do
export environmentVariables="$environmentVariables\n$item"
done
Wenn Sie in Ihrer Variable tatsächlich Zeilenumbruchzeichen und nicht wörtliche \n
Zeichen benötigen, gehen Sie einfach wie folgt vor:
export environmentVariables=$(
cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | [.key, .value] | join("=")'
)