【问题标题】:Assign jq output to bash array将 jq 输出分配给 bash 数组
【发布时间】:2020-02-04 07:05:20
【问题描述】:

我在正确为 jq 解析的 bash 数组赋值时遇到问题。我有来自curl 的 JSON 输出:

{
  "id": 6442,
  "name": "Execute Workflow",
  "description": "Plan: data",
  "status": "In Queue",
  "start_date": 0,
  "end_date": 0,
  "job_type": "Execute Workflow",
  "created_by_name": null,
  "creation_date": 1580762385615,
  "creation_date_str": "02/03/2020 09:39:45 PM",
  "last_updated_date": 1580762385615,
  "last_updated_date_str": "02/03/2020 09:39:45 PM",
  "last_updated_by_name": null,
  "schedule_on": 0,
  "paused_at_step": 0,
  "percent_complete": 0,
  "job_action_type": null,
  "child_job_id": -1
}

我想将两个键值 .id.status 保存到 bash 数组中。

我是这样做的:

array=( $(echo '{ "id": 6442, "name": "Execute Workflow", "description": "Plan: data", "status": "In Queue", "start_date": 0, "end_date": 0, "job_type": "Execute Workflow", "created_by_name": null, "creation_date": 1580762385615, "creation_date_str": "02/03/2020 09:39:45 PM", "last_updated_date": 1580762385615, "last_updated_date_str": "02/03/2020 09:39:45 PM", "last_updated_by_name": null, "schedule_on": 0, "paused_at_step": 0, "percent_complete": 0, "job_action_type": null, "child_job_id": -1}' | jq '.id, .status') ) 

在我尝试获取该数组的第二个元素之前,一切似乎都很好:echo ${array[1]} 我得到了 "In 不是 "In Queue"

我的数组长 3 个元素 echo ${#array[@]} 返回 3 但我希望它长 2 个元素。 有人可以帮帮我吗?

我在 bash 脚本中的下一步是分配 job_status="=${array[1]}",我想获得变量 job_status="In Queue"

【问题讨论】:

  • 一个快速的解决方法是使用eval;像eval array=\($(echo ... | jq ...)\),但这被认为是一种不好的做法
  • OP 在我现在删除的答案中的评论对我来说没有意义 - [1 of 2] 背景.. 可能你给我一个建议,我做错了什么。此 curl 命令在后台执行作业并返回我之前发布的 json。然后我想检查作业是否成功。我有另一个 curl 命令可以通过 REST API 检查它。我将 jobId 和 status 保存到数组中,并将它的第一个元素分配给 job_status var,然后在直到循环中使用 curl 检查它。
  • [2 of 2] 一开始状态为“排队中”,然后变为“正在运行”,然后变为“错误”或“成功”。这些输出我将保存到变量而不是数组中,看起来可以吗?
  • Inian,您对 mapfile 的评论确实很有帮助,但您删除了它?

标签: arrays json bash jq


【解决方案1】:

是的,当您分配给一个数组时,bash 必须转义其所有特殊字符,然后使用默认分隔符(即空格)拆分参数。在源 JSON 中引用参数或空格本身对这里有帮助。

因此,要解决您需要将 IFS 设置为对您的 JSON 数据来说足够独特的分隔符的问题 - 为了示例的目的,将其设为逗号(假设您的 JSON 在 @987654322 @为简洁起见):

bash $ ifs="$IFS"; IFS=','; array=($(<curl.json jq -r '[.id, .status] | @csv')); IFS="$ifs"
bash $ echo ${#array[@]}
2
bash $ echo ${array[1]}
"In Queue"
bash $ 

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2019-06-02
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2012-07-16
    相关资源
    最近更新 更多