bash 中带有可变键的 JSON

bash 中带有可变键的 JSON

在下面的 bash 脚本中,我有 JSON 对象,并且需要具有hostname随机名称的密钥,例如host-$NAME(即host-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

问题是 shell 不会扩展单引号字符串内的变量。另一件小事是你的NAME变量实际上恰好是一个大批由于您为其分配值的方式 ( NAME=(...))。您还可以使用OUTPUT不带引号的变量(这将在空格上分割其内容并将文件名通配应用于所有生成的单词)和 with echo(在某些情况下,这可能会修改其输出的数据)。

考虑采用更安全的方法来创建 JSON 文档。它不是总是可以将 shell 字符串注入到 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" }'

请注意,在这两种情况下,

  1. 该字符串$name已正确进行 JSON 编码。这很重要,因为稍后可能会决定这$name应该是可能需要编码的其他随机字符串。
  2. jo/的输出jq不保存在 shell 变量中。这不是必需的,因为我们只对输出生成的 JSON 文档感兴趣。

相关内容