Adding/appending 在 bash 脚本中通过 jq 将对象指向新创建的具有相同键的 json 数组

Adding/appending objects to a newly created json array with same keys via jq in bash script

我真的很难尝试从同一个 bash 脚本向新创建的 JSON array/file 迭代附加新值。 考虑以下简单的脚本片段:

echo "Enter name: "
read name
echo "Enter Car Model: "
read car
echo "Enter Colour: "
read colour

echo
jq -n --arg name "$name" --arg car "$car" --arg colour "$colour" '{"profiles":[{"name": $name, "car": $car, "colour": $colour}]}' > model.json
echo
cat model.json | jq .

这输出:

Enter name:
Joe
Enter Car Model:
BMW
Enter Colour:
Red

{
  "profiles": [
    {
      "name": "Joe",
      "car": "BMW",
      "colour": "Red"
    }
  ]
}

我希望它最终动态地做这样的事情:

Enter name:
Joe
Enter Car Model:
BMW
Enter Colour:
Red

{
  "profiles": [
    {
      "name": "Joe",
      "car": "BMW",
      "colour": "Red"
    },
    {
      "name": "Peter",
      "car": "Nissan",
      "colour": "White"
    }
  ]
}

等...

我知道我需要在第一组 key:value 条目之后使用循环,但是我将如何附加到新创建的 model.json 文件而不是覆盖初始值通过 bash 脚本中的 jq?

非常感谢

要附加对象,可以使用成语:

.profiles += [...]

由于 jq 的友好处理方式 null,上面的方法最初也可以工作。

顺便说一句,您可以缩写键值对,例如

"name": $name

只是变量名:

$name

例子

为了统一起见,用null预填充model.json可能是有意义的,例如

echo null > model.json

然后就可以统一调用jq了(不用-n选项),例如

jq --arg name "$name" --arg car "$car" --arg colour "$colour" '
  .profiles += [{ $name, $car, $colour}]
' model.json | sponge model.json

注意:在不采取预防措施的情况下使用 sponge 覆盖输入文件是有风险的,尽管在这种情况下风险似乎很小。

用了上面的方法还是没有追加: 即

Enter name:
Joe
Enter Car Model:
BMW
Enter Colour:
Blue

Add a new entry? (y/n):  y
Enter name:  
Paul
Enter Car Model:  
Nissan
Enter Colour:  
Black

Add a new entry? (y/n):  n



{
  "profiles": [
    {
      "name": "Paul",
      "car": "Nissan",
      "colour": "Black"
    }
  ]
}