次のbashスクリプトにはJSONオブジェクトがあり、たとえば、、などの任意の名前のhostname
キーが必要です。どうすればいいですか?host-$NAME
host-1
host-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ドキュメントに挿入できます。この特別な場合はかなり安全でなければなりませんが、通常は引用符や改行などの文字を適切に処理する方法を知るツールを使用したいと思います。
使用jo
JSONドキュメントを作成します。
#!/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" }'
どちらの場合も注意してください。
- 文字列が
$name
正しくJSONにエンコードされました。これは、後で$name
エンコードする必要がある他の任意の文字列でなければならないと判断できるため、重要です。 jo
/の出力はjq
シェル変数に保存されません。生成されたJSONドキュメントの出力にのみ興味があるので、これは必要ありません。