jq没有用参数替换json值

时间:2017-11-19 07:46:59

标签: json variables jq string-literals string-interpolation

test.sh不替换test.json参数值($ input1和$ input2)。 result.json具有相同的ParameterValue“$ input1 / solution / $ input2.result”

 [
    {
      "ParameterKey": "Project",
      "ParameterValue": [ "$input1/solution/$input2.result" ]
     }
    ]

test.sh

#!/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

2 个答案:

答案 0 :(得分:5)

jq 脚本中的

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字符串。只有在字符串插值后才会这样。