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"
}
]
}
我真的很难尝试从同一个 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"
}
]
}