Скажем, у меня есть 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
но есть ли способ сделать это без использования стандартного ввода?
jq
может читать из файла, и, поскольку вы используете bash, вы можете сделать jq -r .[].host < <( echo '[{"host":"xxx", "port":3939},{"host":"yyy","port":7373'}])
, но я сильно подозреваю, что есть лучший способ добиться того, что вы хотите. Но трудно увидеть, что именно вы пытаетесь сделать.
Я обновляю OP, чтобы сделать его немного яснее - просто пытаюсь прочитать свойства из json без необходимости эха на стандартный ввод jq.
да. Также нет необходимости экспортировать 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;
Похоже, символы продолжения строки не отображались форумом. Возможно, их удвоение помогло бы.
@ColeTierney - при использовании bash здесь не нужны символы продолжения строки.
@peak Вот что изначально привлекло мое внимание. Мне не терпелось их убрать, поэтому я попробовал bash 5.0 и получил ошибку без символов продолжения строки.
Я проверил с помощью GNU bash, version 5.0.7(1)-release
без происшествий.
export connection_info = echo
обычно не работает с чем-то вродеbash: export: '=': not a valid identifier
, так как пытается экспортировать переменную с недопустимым именем=