Ich bin nicht mehr in der Lage, doppelte Anführungszeichen in Heredoc zum Laufen zu bringen.

Ich bin nicht mehr in der Lage, doppelte Anführungszeichen in Heredoc zum Laufen zu bringen.

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 jqund sie alle an eine Shell-Variable anhängen, $environmentVariableswie:

FirstKey=FirstValue
SecondKey=SecondValue
ThirdKey=ThirdValue

Da aber jqin seinem Befehl doppelte Anführungszeichen erforderlich sind und ich heredoc verwenden muss, um die $environmentVariablesaktuelle 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 whilemit 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 \nZeichen benötigen, gehen Sie einfach wie folgt vor:

export environmentVariables=$(
    cat /LocalSecrets/EnvironmentVariables.json |
    jq -r 'to_entries[] | [.key, .value] | join("=")'
)

verwandte Informationen