JSONフラグメントがあります。
以下は機能しません。
VALUE=<<PERSON
{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}
PERSON
echo -n "$VALUE" | python -m json.tool
結果は次のとおりです。
JSONオブジェクトをデコードできませんでした
jq
を使用して同じことを行うe。
echo -n "$VALUE" | jq '.'
出力はありません。
以下についても同じ動作があります。
VALUE=<<PERSON
'{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}'
PERSON
echo -n "$VALUE" | python -m json.tool
応答:
JSONオブジェクトをデコードできませんでした
しかし、次の作品:
VALUE='{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}'
echo -n "$VALUE" | jq '.'
echo -n "$VALUE" | python -m json.tool
VALUE=<<PERSON
some data
PERSON
echo "$VALUE"
出力なし。
Here-documentはredirectionです。変数にリダイレクトすることはできません。
コマンドラインが解析されると、リダイレクトは変数の割り当てとは別のステップで処理されます。したがって、コマンドは(スペースに注意)と同等です。
VALUE= <<PERSON
some data
PERSON
つまり、空の文字列を変数に割り当て、標準入力をhere-stringからコマンドにリダイレクトします(ただし、コマンドがないため、何も起こりません)。
ご了承ください
<<PERSON
some data
PERSON
そのまま有効です
<somefile
データが含まれるように標準入力ストリームを設定できるコマンドがないため、失われるだけです。
これはうまくいくでしょう:
VALUE=$(cat <<PERSON
some data
PERSON
)
ここで、ヒアドキュメントを受け取るコマンドはcat
であり、標準出力にコピーします。これは、コマンド置換によって変数に割り当てられるものです。
あなたのケースでは、代わりに使用できます
python -m json.tool <<END_JSON
JSON data here
END_JSON
変数にデータを格納するという余分なステップを踏むことなく。
変数がヒアドキュメントによって設定されていないため:
$ VALUE=<<PERSON
> {
> "type": "account",
> "customer_id": "1234",
> "customer_email": "[email protected]",
> }
> PERSON
$ echo "$VALUE"
$
ヒアドキュメントを使用して変数に値を割り当てる場合は、次のようなものが必要です。
$ read -d '' -r VALUE <<PERSON
{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]",
}
PERSON
これは、JSONで使用するヒアドキュメントを定義した方法が間違っているためです。あなたはそれを次のように使う必要があります
VALUE=$(cat <<EOF
{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]",
}
EOF
)
そしてprintf "$VALUE"
は期待どおりにJSONをダンプする必要があります。
ヒアドキュメントと変数はうまく混合しないか、少なくともこのように混合しません。あなたはどちらかができます…
python -m json.tool <<PERSON
{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]",
}
PERSON
または…
VALUE='{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]",
}'
内側の二重引用符をエスケープする必要がないように、一重引用符を使用しました。もちろん、二重引用符を使用することもできます。 g。パラメータを拡張する必要がある場合:
VALUE="{
\"type\": \"account\",
\"customer_id\": ${ID},
\"customer_email\": \"${EMAIL}\",
}"
その後、変数値を後で使用できます。
echo -n "$VALUE" | python -m json.tool