このコードを実行しようとしています:
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("=")'
)