Bash: захват вывода из команды curl и сопоставление значений ключа из вывода в новые пары ключ-значение - PullRequest
0 голосов
/ 15 мая 2019

команда curl выдает мне вывод в формате JSON следующим образом: - [{"Description":"","Value":"bc","Key":"a"},{"Description":"","Value":"ef","Key":"d"},...]

Теперь я хочу получить значения только «Key» и «Value» таким образом, чтобы они выполнялись при выполнении echo $a это дает "bc", echo $d это дает "ef" и т. Д.

Примечание: я абсолютно новичок в создании сценариев оболочки / bash, поэтому этот вопрос

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Вы можете использовать jq для анализа массива и получения необходимого значения.

echo '[{"Description":"","Value":"bc","Key":"a"},{"Description":"","Value":"ef","Key":"d"}]' | jq '.[] | select(.Key == "d").Value'

Это должно дать вам "ef" и,

echo '[{"Description":"","Value":"bc","Key":"a"},{"Description":"","Value":"ef","Key":"d"}]' | jq '.[] | select(.Key == "a").Value'

Даст вам "до н. Э."

Вы можете заменить echo вашим оператором curl.

Подробнее о jq: https://stedolan.github.io/jq/

0 голосов
/ 15 мая 2019

Примерно так может работать:

dataString='[{"Description":"","Value":"bc","Key":"a"},{"Description":"","Value":"ef","Key":"d"},...]'
while read value key; do
    echo "key: '$key', value : '$value'"
done < <(echo "$dataString" | sed 's/},{/\n/g' | tr -d '[]{}"' | tr ':' ',' | cut -d',' -f 4,6 --output-delimiter=' ')

Подробности:

  • dataString - это вывод curl
  • все (echo "$dataString"....) просто превращается $dataString в:

    bc a

    ef d

  • конструкция <(...) является процесс замены .Он позволяет читать вывод команды тем же методом, который вы читали из файла

...