- 此问题在此处已有答案**:
bash & jq: add attribute with object value(2个答案)
Passing variable in jq to filter with select fails(1个答案)
昨天关门了。
我只是在bash脚本中使用jq,尝试用数组替换json文件中的对象值,json文件(截短)如下所示:
{
"objects": {
"type": "foo",
"host": "1.1.1.1",
"port": "1234"
}
}
我想用不同值的数组替换主机对象的值,因此它看起来像这样:
{
"objects": {
"type": "foo",
"host": ["1.1.1.1","2.2.2.2"],
"port": "1234"
}
}
我用这个脚本测试了一下,输入来自一个简单的逗号分隔的字符串,我把它转换成一个合适的json数组(看起来可以工作),但是我不能用数组替换值。
#!/bin/bash
objectshost="1.1.1.1,2.2.2.2"
objectshost_array=$(jq -c -n --arg arg $objectshost '$arg|split(",")')
jq --arg value "$objectshost_array" '.objects.host = $value' ./test.json > ./test.json.tmp
我最后得到的,是这个:
{
"objects": {
"type": "foo",
"host": "[\"1.1.1.1\",\"2.2.2.2\"]",
"port": "1234"
}
}
结果似乎是某种逻辑结果,因为脚本只是用数组字符串替换了值,但这不是我所期望得到的。)
我发现了一些类似的问题,但它们都是处理替换现有数组或键/值对中的值,但我的问题似乎是从单个值到数组的转换。
有人能把我推到正确的方向吗?或者我应该忘记jq,把json文件当作一个简单的文本文件来威胁?
先谢谢你,
安德烈
2条答案
按热度按时间dxpyg8gm1#
它可以使用参数的条件赋值:
或与独立jq脚本相同;更易于阅读和维护:
myJQScript
:使其可执行:
使用参数运行它以将数组条目添加到主机
wqsoz72f2#
您可以使用一个jq命令来完成此操作:
这样做的另一个好处是不需要Bash数组,但可以与任何shell一起使用。
如果您已经有了JSON数组,则必须使用
--argjson
而不是--arg
。--arg
总是创建字符串类型的变量,但是--argjson
会将该值解析为JSON实体。