Читайте json из аргумента вместо стандартного ввода, используя jq - PullRequest
1 голос
/ 31 мая 2019

Скажем, у меня есть 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 

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

1 Ответ

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

Да. Также нет необходимости экспортировать 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;
...