ヒアドキュメント内で二重引用符を機能させることに苦労しています

ヒアドキュメント内で二重引用符を機能させることに苦労しています

このコードを実行しようとしています:

    while read Item; do
        export environmentVariables="$environmentVariables\n      - $Item"
    done <<< "$(
        cat /LocalSecrets/EnvironmentVariables.json |
        jq -r 'to_entries[] | "\(.key)=\(.value)"' |
    )"

にシンプルな JSON ファイルがあります/LocalSecrets/EnvironmentVariables.json。これは、シンプルなキー/値ペアの JSON オブジェクトです。

{
    "FirstKey": "FirstValue",
    "SecondKey": "SecondValue",
    "ThirdKey": "ThirdValue"
}

jqそして、次のようにしてそれを読み取り、すべてをシェル変数に追加したいと思います$environmentVariables

FirstKey=FirstValue
SecondKey=SecondValue
ThirdKey=ThirdValue

しかし、jqコマンドに二重引用符が必要で、$environmentVariablesループ内の現在のシェルに を保持するためにヒアドキュメントを使用する必要があるため、行き詰まってしまいます。そのコードは実行されず、構文エラーが発生します。

どうすればいいでしょうか? 他の解決策も検討します。

答え1

実際、ヒアドキュメント内に二重引用符が適切に配置されています。ただし、最後の引用符|は不要で、構文エラーが発生します。

最初のパラメータの割り当てにより、新しい行が追加されますが、次のようにすれば動作するはずです。heredoc の使用:

while read item; do
    export environmentVariables="$environmentVariables\n$item"
done <<< "$(
    cat /LocalSecrets/EnvironmentVariables.json |
    jq -r 'to_entries[] | [.key, .value] | join("=")'
)"

同じですが、プロセス置換を使用します。

while read item; do
    export environmentVariables="$environmentVariables\n$item"
done < <(cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | [.key, .value] | join("=")')

<(commands)プロセス置換、コマンドの実行結果は特別なファイル名として表示され、while単純な入力リダイレクトでに渡されます<

あるいは、単純なパイプを使用して、シェルに最後の要素 ( while) を現在のシェル環境で実行するように指示し、変数の値を保持することもできます。

shopt -s lastpipe
cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | [.key, .value] | join("=")' |
while read item
do
    export environmentVariables="$environmentVariables\n$item"
done

また、変数に文字そのものではなく改行文字が必要な場合は\n、次のようにします。

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

関連情報