Присвоение массива, проанализированного с помощью jq, массиву сценариев Bash - PullRequest
0 голосов
/ 08 января 2019

Я проанализировал файл json с помощью jq следующим образом:

кошка test.json | jq '.logs' | jq '. []' | jq '._id' | JQ-S

Возвращает массив, подобный этому: [34,235,436,546, .....] Используя скрипт bash, я описал массив:

объявляет -a msgIds = ...

Этот массив использует () вместо [], поэтому, когда я передаю указанный выше массив в этот массив, он не будет работать. ([324,32,45 ..]) это вызывает проблему. Если я удаляю jq-s, создается массив с одним членом. Есть ли способ решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

из FAQ по jq (https://github.com/stedolan/jq/wiki/FAQ):

?: Как преобразовать поток JSON-текстов, созданных jq, в массив bash с соответствующими значениями?

A: Одним из вариантов будет использование mapfile (он же readarray), например:

mapfile -t array <<< $(jq -c '.[]' input.json)

Альтернативой, которая может указывать на то, что делать в других оболочках, является использование read -r в цикле while. Следующий скрипт bash заполняет массив x текстами JSON. Ключевыми моментами являются использование опции -c и идиома bash while read -r value; do ... done < <(jq .......):

#!/bin/bash
x=()
while read -r value
do
  x+=("$value")
done < <(jq -c '.[]' input.json)
0 голосов
/ 08 января 2019

Используйте jq -r для вывода строки «raw», без форматирования JSON, и используйте форматер @sh, чтобы отформатировать результаты в виде строки для потребления оболочки. Согласно документам JQ:

@ ш:

Входные данные экранированы для использования в командной строке для оболочки POSIX. Если входные данные являются массивом, выходные данные будут представлять собой последовательность разделенных пробелами строк.

Так можно сделать, например.

msgids=($(<test.json jq -r '.logs[]._id | @sh'))

и получите желаемый результат.

...