jq Обработка массива JSON в качестве входных данных для анализа элементов массива JSON в цикле while - PullRequest
0 голосов
/ 19 октября 2018

Посмотрел много постов на похожую тему, но я делаю что-то не так, так как постоянно получаю "jq: error: Could not open file" или "Invalid numeric literal".Я пытаюсь передать массив JSON в виде строкового значения через jq в цикл while и прочитать элементы массива JSON в цикле.Базовый скрипт bash работает с <<< $ {PRESET_ARR}), но не работает при вызове из приложения nodejs.</p>

Попытка вызвать этот скрипт bash из приложения nodejs.Я могу заставить работать только пакетный скрипт с <<< $ {PRESET_ARR}) Но вызов пакетного скрипта из nodejs вызывает «ошибку разбора: неверный числовой литерал в строке 1». </p>

Изменено для использования <<<echo "$ {PRESET_ARR}") и вызов из nodejs вызывает "jq: error: не удалось открыть файл" </p>

Мой сценарий bash:

#!/bin/bash

PRESET_ARR=$1
echo "PRESET_ARR=${PRESET_ARR}"
#PRESET_ARR='[{"resolution":"2160*2160","bitrate":60M,"framerate":60},{"resolution":"1350*1350","bitrate":"30M","framerate":60}]'
#./batch.sh '[{"resolution":"2160*2160","bitrate":"60M","framerate":60},{"resolution":"1350*1350","bitrate":"30M","framerate":60}]'
#echo "${PRESET_ARR}" | jq -r '.[] | (.resolution, .bitrate, .framerate)' |

while IFS= read  resolution &&
      IFS= read  bitrate &&
      IFS= read  framerate;
#for row in $(echo "${PRESET_ARR}" | jq -r '.[] | (.resolution, .bitrate, .framerate)');
do

    echo "resolution=$resolution"
    echo "bitrate=$bitrate"
    echo "framerate=$framerate"

done < <(jq -r '.[] | (.resolution, .bitrate, .framerate)' <<< echo "${PRESET_ARR}")
#done < <(jq -r '.[] | (".resolution", ".bitrate", ".framerate")' <<< ${PRESET_ARR})

TIA

1 Ответ

0 голосов
/ 19 октября 2018

Возможно, ваш скрипт слишком инкрустирован, чтобы эффективно его отлаживать.Как бы то ни было, ниже приведен откорректированный фрагмент из вашего скрипта, и он прекрасно работает:

#!/bin/bash

PRESET_ARR='[{"resolution":"2160*2160","bitrate":"60M","framerate":60},{"resolution":"1350*1350","bitrate":"30M","framerate":60}]'

while IFS= read  resolution &&
      IFS= read  bitrate &&
      IFS= read  framerate
do

    echo "resolution=$resolution"
    echo "bitrate=$bitrate"
    echo "framerate=$framerate"

done < <(jq -r '.[] | (.resolution, .bitrate, .framerate)' <<< "${PRESET_ARR}")

Возможно, проблему, с которой вы столкнулись, можно решить, заменив PRESET_ARR=$1 на PRESET_ARR="$1".

...