【问题标题】:Can't assign multiple values to 3 variables不能为 3 个变量分配多个值
【发布时间】:2021-11-11 10:51:38
【问题描述】:

请求

curl -XGET http\://my_host\:9111/api/issues/search\?componentKeys\=my_poject\&facets\=severities\&p\=1\&ps\=1

这里回复:

{
  "total": 10057,
  "p": 1,
  "ps": 1,
  "paging": {
    "pageIndex": 1,
    "pageSize": 1,
    "total": 10057
  },
  "effortTotal": 51031,
  "issues": [
    {
      "key": "AX0NVCNfENszTAxEgX5e",
      "rule": "java:S122",
      "severity": "MINOR",
      "component": "my_project:SomeFile.java",
      "project": "my_project",
      "line": 241,
      "hash": "1111111111",
      "textRange": {
        "startLine": 241,
        "endLine": 241,
        "startOffset": 0,
        "endOffset": 46
      },
      "flows": [],
      "status": "OPEN",
      "message": "At most one statement is allowed per line, but 2 statements were found on this line.",
      "effort": "1min",
      "debt": "1min",
      "author": "eugeniur",
      "tags": [
        "convention"
      ],
      "creationDate": "2021-11-11T06:40:05+0200",
      "updateDate": "2021-11-11T06:40:05+0200",
      "type": "CODE_SMELL",
      "scope": "MAIN"
    }
  ],
  "components": [
    {
      "key": "my_project",
      "enabled": true,
      "qualifier": "TRK",
      "name": "Parent",
      "longName": "Parent"
    },
    {
      "key": "my_project:MyFile.java",
      "enabled": true,
      "qualifier": "FIL",
      "name": "XStartDServerComponent.java",
      "longName": "MyFile.java",
      "path": "MyFile.java"
    }
  ],
  "facets": [
    {
      "property": "severities",
      "values": [
        {
          "val": "CRITICAL",
          "count": 5818
        },
        {
          "val": "MAJOR",
          "count": 1459
        },
        {
          "val": "BLOCKER",
          "count": 1286
        },
        {
          "val": "MINOR",
          "count": 1163
        },
        {
          "val": "INFO",
          "count": 331
        }
      ]
    }
  ]
}

现在我要提取密钥:"total", "issues", "facets.values"

所以我在我的 bash 脚本中尝试这个:

#!/bin/bash
readonly BASE_URL=http://my_host:9111/api
readonly PROJECT_KEY=my_project

read totalIssues facetsArr issuesArr < <(echo $(curl -XGET $BASE_URL/issues/search\?componentKeys\=$PROJECT_KEY\&facets\=severities\&p\=1\&ps\=1 |
                       jq -r '.total, .issues[], .facets[].values'))
echo "total      : $totalIssues"
echo "facetsArr     : $facetsArr"
echo "issuesArr  : $issuesArr"

但结果是:

total      : 10057
facetsArr  : {
issuesArr  : "key": "AX0NVCNfENszTAxEgX5e", "rule": "java:S122", "severity": "MINOR", "component": "MyFile.java", "project": "myProject", "line": 241, "hash": "b68d3b4b390c81e2714d263b31acdd08", "textRange": { "startLine": 241, "endLine": 241, "startOffset": 0, "endOffset": 46 }, "flows": [], "status": "OPEN", "message": "At most one statement is allowed per line, but 2 statements were found on this line.", "effort": "1min", "debt": "1min", "author": "eugeniur", "tags": [ "convention" ], "creationDate": "2021-11-11T06:40:05+0200", "updateDate": "2021-11-11T06:40:05+0200", "type": "CODE_SMELL", "scope": "MAIN" } [ { "val": "CRITICAL", "count": 5818 }, { "val": "MAJOR", "count": 1459 }, { "val": "BLOCKER", "count": 1286 }, { "val": "MINOR", "count": 1163 }, { "val": "INFO", "count": 331 } ]

为什么“facetsArr”的值不正确?

facetsArr”必须是:

facetsArr  : [ { "val": "CRITICAL", "count": 5818 }, { "val": "MAJOR", "count": 1459 }, { "val": "BLOCKER", "count": 1286 }, { "val": "MINOR", "count": 1163 }, { "val": "INFO", "count": 331 } ]

【问题讨论】:

    标签: json bash jq


    【解决方案1】:
    1. 使用字符串操作在每个值之间插入换行符 (\n),现在每行都包含您要捕获的值
    2. 引用jq 命令,因为它可能包含空格[info]
    3. IFS 设置为换行符[info]
    4. 使用read -d '' [docs]

      -d delim

      继续直到读取 DELIM 的第一个字符,而不是 比换行符


    应用这些修复,脚本将如下所示:

    IFS=$'\n'
    read -r -d '' totalIssues facetsArr issuesArr <<< "$( jq -r '"\(.total)\n\(.facets[].values)\n\(.issues[])"' input)"
    echo "total      : $totalIssues"
    echo "facetsArr  : $facetsArr"
    echo "issuesArr  : $issuesArr"
    

    注意:我已将 curl 命令替换为名为 input 的实际文件,其中包含 OP 的 JSON


    输出将是:

    total      : 10057
    facetsArr  : [{"val":"CRITICAL","count":5818},{"val":"MAJOR","count":1459},{"val":"BLOCKER","count":1286},{"val":"MINOR","count":1163},{"val":"INFO","count":331}]
    issuesArr  : {"key":"AX0NVCNfENszTAxEgX5e","rule":"java:S122","severity":"MINOR","component":"my_project:SomeFile.java","project":"my_project","line":241,"hash":"1111111111","textRange":{"startLine":241,"endLine":241,"startOffset":0,"endOffset":46},"flows":[],"status":"OPEN","message":"At most one statement is allowed per line, but 2 statements were found on this line.","effort":"1min","debt":"1min","author":"eugeniur","tags":["convention"],"creationDate":"2021-11-11T06:40:05+0200","updateDate":"2021-11-11T06:40:05+0200","type":"CODE_SMELL","scope":"MAIN"}
    

    【讨论】:

      【解决方案2】:

      效率稍低,但只解析(小)响应 3 次会简单得多。

      #!/bin/bash
      readonly BASE_URL=http://my_host:9111/api
      readonly PROJECT_KEY=my_project
      
      response=$(curl -XGET "$BASE_URL/issues/search?componentKeys=$PROJECT_KEY&facets=severities&p=1&ps=1")
      
      total=$(jq '.total' <<< "$response")
      issues=$(jq '.issues' <<< "$response")
      facets=$(jq '.facets[].values' <<< "$response")
      
      # ...
      

      那么您不必担心使用jq 构造单个输出,而bash 无论如何都必须解析。

      (我有意将issues 的值保留为JSON 数组,而不是issues 的流,以防数组中存在多个对象。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-28
        相关资源
        最近更新 更多