Назначить вывод jq массиву bash - PullRequest
0 голосов
/ 04 февраля 2020

У меня проблема с присвоением значения массиву bash, который был проанализирован jq. У меня есть JSON вывод из curl:

{
  "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".

1 Ответ

1 голос
/ 04 февраля 2020

да, когда вы присваиваете массиву, bash должен экранировать все его специальные символы, а затем разделять аргументы с разделителем по умолчанию, который является пробелом. Здесь нет необходимости в цитировании аргументов или пробелов как таковых в источнике JSON, который бы здесь помог.

Таким образом, чтобы обойти это, вам нужно установить IFS в качестве разделителя, который является уникальным достаточно для ваших JSON данных - для примера, пусть это будет запятая (при условии, что ваш JSON в curl.json для краткости):

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 $ 
...