文字列補間は bash で引用符を保持します。

文字列補間は bash で引用符を保持します。

ユーザー環境変数の一部の値を置き換えるjsonの本文をフォーマットする必要があります。 bashスクリプトでjson文字列を適切に置き換える方法をshoptまたは他の方法で見つけます。ただし、二重引用符を有効なjsonに保つか、再挿入してください。引用符と二重引用符の前処理を試みました。

例:

$ export env_var1=val1
$ export env_var2=val2
$ export args='{"key1": "${env_var1}", "key2": "${env_var2}"}'
$ echo $args #original input
$ eval echo $args #bad output- variables interpolated but quotes lost
Expected output= {"key1": "val1", "key2": "val2"}

編集:私の制限は、任意のjson文字列を事前に知らず、構造や名前を事前に知らないため、手動でフォーマットを再指定できないことです。私は解く必要はありません。これコンクリートケース - これはおもちゃの例です。私は、例で表されたランダムな文字列の一般的な解決策を定式化したいと思います。キー、値、またはその両方は環境変数です。 jsonは任意に入れ子にすることができ、非常に大きくすることができます。

答え1

引用符をエスケープできます。

{\"key1\": \""$env_var1"\", "key2": \""$env_var2"\"}

jqを使用できます。

jq -n --arg one "$env_var1" --arg two "$env_var2" '{key1: $one, key2: $two}'

またはジョー:

jo key1="$env_var1" key2="$env_var2"

私はしばしば複雑なjsonオブジェクトを処理するためにheredocsを使用します。

read -rd '' json <<EOF
{
    key1: "$env_var1",
    key2: "$env_var2"
}
EOF
echo "$json"

答え2

原則として、これらの正確な変数には次のものを使用できますenvsubst

$ export env_var1=val1
$ export env_var2=val2
$ export args='{"key1": "${env_var1}", "key2": "${env_var2}"}'
$ echo "$args" | envsubst
{"key1": "val1", "key2": "val2"}

しかし、a)一致する環境変数だけでなく、すべての環境変数を拡張し、env_*b)有効なJSONを作成するために何も引用しません。たとえば、破損した参照がenv_var1='double"quote'あります。{"key1": "double"quote", ...

env_*最初の問題を解決するには、Bashで同様の操作を実行して、一致する変数名のリストを含む文字列を取得できますenvsubst

$ echo "$args" | envsubst "$(printf '$%s ' "${!env_@}")"
{"key1": "val1", "key2": "val2"}

(問題は起動$フラグが必要なことです。)

envsubst2番目の変数の場合は、変数をローまたはで渡す前に変数を前処理する必要がありますjq

次の操作は、--arglikeという名前のすべての変数のオプションを生成し、入力文字列のすべての項目を変更して変数として認識するようにします(関連しない一致文字列も変更されることに注意してください)。jqenv_*"${foo}"$foojq

#!/bin/bash

args=(); 
for varname in "${!env_@}"; do
    args+=(--arg "$varname" "${!varname}");
done;
jq -n -c -M "${args[@]}" "$(sed -E -e 's/"\$\{([a-zA-Z0-9_]+)\}"/$\1/g' <<< "$1")"

走る:

$ export env_var1='double"quote' env_var2=foobar
$ bash jsonexpand.sh '{"key1": "${env_var1}", "key2": "${env_var2}"}'
{"key1":"double\"quote","key2":"foobar"}

答え3

シェルが解析しないように式を引用する必要があります。このマイナーなケースでは

echo '{"key1": "var1", "key2": "var2"}'

あなたの場合、変数を補間する必要がある場合は、次のいずれかのオプションが機能します。

printf '{"key1": "%s", "key2": "%s"}\n' "$env_var1" "$env_var2"
echo "{\"key1\": \"$env_var1\", \"key2\": \"$env_var2\"}"
echo '{"key1": "'"$env_var1"', "key2": "'"$env_var2"'"}'

おそらく最も読みやすい最初の項目をお勧めします。

関連情報