test.sh不替换test.json参数值($ input1和$ input2)。 result.json具有相同的ParameterValue“$ input1 / solution / $ input2.result”
[
{
"ParameterKey": "Project",
"ParameterValue": [ "$input1/solution/$input2.result" ]
}
]
#!/bin/bash
input1="test1"
input2="test2"
echo $input1
echo $input2
cat test.json | jq 'map(if .ParameterKey == "Project" then . + {"ParameterValue" : "$input1/solution/$input2.result" } else . end )' > result.json
答案 0 :(得分:5)
shell变量应该通过--arg name value
进行插值或作为参数传递:
jq --arg inp1 "$input1" --arg inp2 "$input2" \
'map(if .ParameterKey == "Project"
then . + {"ParameterValue" : ($inp1 + "/solution/" + $inp2 + ".result") }
else . end)' test.json
输出:
[
{
"ParameterKey": "Project",
"ParameterValue": "test1/solution/test2.result"
}
]
答案 1 :(得分:2)
在你的jq程序中,你引用了“$ input1 / solution / $ input2.result”,因此它是一个JSON字符串文字,而你显然想要字符串插值;你还需要一方面区分shell变量($ input1和$ input2),另一方面区分相应的jq美元变量(可能有也可能没有相同名称)。
由于你的shell变量是字符串,你可以使用--arg
命令行选项传递它们(例如--arg input1 "$input1"
如果你选择以相同的方式命名变量)。
您可以在jq手册中阅读字符串插值(请参阅https://stedolan.github.io/jq/manual,但请注意顶部的链接以获取不同版本的jq)。
还有其他方法可以实现所需的结果,但是使用带有同名变量的字符串插值,你会写:
"\($input1)/solution/\($input2).result"
请注意,上面的字符串本身并不是JSON字符串。只有在字符串插值后才会这样。