Прочитайте json из аргумента вместо стандартного ввода, используя jq

Скажем, у меня есть JSON так:

export connection_info = ` echo '{
  "values": [
    {"host":"xxx", "port": 3939},
    {"host":"yyy", "port": 7373}
  ]
}'  | jq -c `

И я хочу прочитать это так:

#!/usr/bin/env bash

echo "$connection_info" | jq -r '.values[]' |

  while read item; do

     timeout 10 telnet `jq -r "$item"` 9200 || {
        echo "Could not connect to host: $host port: $port"
     }
  done;

как можно разобрать хост и порт из пункта? Что-то вроде этого:

Я мог бы, вероятно, сделать:

host=`echo "$item" | jq -r '.host'`
port=`echo "$item" | jq -r '.port'`

timeout 10 telnet "$host" "$port" 9200 

но есть ли способ сделать это без использования стандартного ввода?

export connection_info = echo обычно не работает с чем-то вроде bash: export: '=': not a valid identifier, так как пытается экспортировать переменную с недопустимым именем =
William Pursell 30.05.2019 23:47
jq может читать из файла, и, поскольку вы используете bash, вы можете сделать jq -r .[].host < <( echo '[{"host":"xxx", "port":3939},{"host":"yyy","port":7373'}]), но я сильно подозреваю, что есть лучший способ добиться того, что вы хотите. Но трудно увидеть, что именно вы пытаетесь сделать.
William Pursell 30.05.2019 23:52

Я обновляю OP, чтобы сделать его немного яснее - просто пытаюсь прочитать свойства из json без необходимости эха на стандартный ввод jq.

user5047085 31.05.2019 00:08
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
3
397
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

да. Также нет необходимости экспортировать connection_info.

Например:

#!/bin/bash

connection_info='{
  "values": [
    {"host":"xxx", "port": 3939},
    {"host":"yyy", "port": 7373}
  ]
}'

jq -n --argjson ci "$connection_info" -cr '$ci | .values[] | "\(.host) \(.port)"' |
while read -r host port ; do
     timeout 10 telnet "$host" "$port" ||
        echo "Could not connect to host: $host port: $port"
done;

Использование стандартного ввода

Для справки, ваш скрипт также можно настроить следующим образом:

#!/bin/bash

connection_info='{
  "values": [
    {"host":"xxx", "port": 3939},
    {"host":"yyy", "port": 7373}
  ]
}'

echo "$connection_info" | jq -cr '.values[] | "\(.host) \(.port)"' |
while read -r host port ; do
     timeout 10 telnet "$host" "$port" ||
        echo "Could not connect to host: $host port: $port"
done;

Похоже, символы продолжения строки не отображались форумом. Возможно, их удвоение помогло бы.

Cole Tierney 31.05.2019 01:54

@ColeTierney - при использовании bash здесь не нужны символы продолжения строки.

peak 31.05.2019 02:10

@peak Вот что изначально привлекло мое внимание. Мне не терпелось их убрать, поэтому я попробовал bash 5.0 и получил ошибку без символов продолжения строки.

Cole Tierney 31.05.2019 21:48

Я проверил с помощью GNU bash, version 5.0.7(1)-release без происшествий.

peak 31.05.2019 21:54

Другие вопросы по теме