代码之家  ›  专栏  ›  技术社区  ›  spiderman

jq没有用参数替换json值

  •  5
  • spiderman  · 技术社区  · 7 年前

    测验sh不会取代测试。json参数值($input1和$input2)。后果json具有相同的参数值“$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
    
    2 回复  |  直到 7 年前
        1
  •  8
  •   RomanPerekhrest    7 年前

    中的shell变量 jq公司 脚本应通过插入或作为参数传递 --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"
      }
    ]
    
        2
  •  4
  •   peak    7 年前

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