Bashに変更可能なキーを持つJSON

Bashに変更可能なキーを持つJSON

次のbashスクリプトにはJSONオブジェクトがあり、たとえば、、などの任意の名前のhostnameキーが必要です。どうすればいいですか?host-$NAMEhost-1host-3

#!/bin/bash
NAME=($(( ( RANDOM % 10 )  + 1 )))
OUTPUT='{
  "hostname": "host-$NAME",
  "plan": "baremetal_0",               
  "operating_system": "coreos_stable"
}'

echo $OUTPUT

スクリプトの出力は次のとおりです。

$ ./packet-ask.sh 
{ "hostname": "host-$NAME", "plan": "baremetal_0", "operating_system": "coreos_stable" }

答え1

この試み:

OUTPUT='{
  "hostname": "host-'$NAME'",
...

答え2

問題は、シェルが一重引用符で囲まれた文字列内の変数を拡張しないことです。もう一つの小さな点は、NAME変数が実際に発生することです。大量に値を割り当てる方法のため( NAME=(...))。OUTPUT引用符なしで変数を使用することもできます(これにより、その内容がスペースに分割され、生成されたすべての単語にファイル名のグロービングが適用されます)。引用符を使用してecho(場合によっては出力されるデータを変更することができます)、使用することもできます。

JSONドキュメントを生成するより安全な方法を検討してください。そうではないいつもシェル文字列をJSONドキュメントに挿入できます。この特別な場合はかなり安全でなければなりませんが、通常は引用符や改行などの文字を適切に処理する方法を知るツールを使用したいと思います。

使用joJSONドキュメントを作成します。

#!/bin/bash

printf -v name 'host-%s' "$(( 1 + (RANDOM % 10) ))"

jo hostname="$name" plan='baremetal_0' operating_system='coreos_stable'

使用jq同じことを行います。

#!/bin/bash

printf -v name 'host-%s' "$(( 1 + (RANDOM % 10) ))"

jq -n -c --arg name "$name" \
    '{ "hostname": $name, "plan": "baremetal_0", "operating_system": "coeros_stable" }'

どちらの場合も注意してください。

  1. 文字列が$name正しくJSONにエンコードされました。これは、後で$nameエンコードする必要がある他の任意の文字列でなければならないと判断できるため、重要です。
  2. jo/の出力はjqシェル変数に保存されません。生成されたJSONドキュメントの出力にのみ興味があるので、これは必要ありません。

関連情報