Нет никакого смысла использовать здесь несколько echo
, а определенно нет смысла делать два запроса к API, когда все необходимые данные включены в каждый результат.
#!/usr/bin/env bash
curl -X GET 'https://api.sunrise-sunset.org/json?lat=36.7201600&lng=-4.4203400' | \
jq -r '.results | "Sunrise is expected at \(.sunrise) and sunset is expected at \(.sunset)"
Если у вас есть более сложный подход, который не идеален, он все равно помогает использовать больше переменных:
#!/usr/bin/env bash
api_output=$(curl -X GET 'https://api.sunrise-sunset.org/json?lat=36.7201600&lng=-4.4203400') || exit
sunrise=$(jq -r '.results.sunrise' <<<"$api_output")
sunset=$(jq -r '.results.sunset' <<<"$api_output")
echo "Sunrise is expected at $sunrise and sunset at $sunset."
Обратите внимание на использование аргумента -r
для jq
сказать ему выводить «необработанные строки» - вот почему tr
здесь не нужен.Кроме того, поскольку echo
ставит новую строку после каждого аргумента, вы должны запускать echo
только один раз для каждой требуемой строки вывода.(Аргумент -n
может подавлять это в некоторых версиях, но на него небезопасно полагаться; лучше использовать printf '%s' ...
, когда завершающие символы новой строки нежелательны).
jq
аналогично записывает новую строку после каждой строкивывода (как и все хорошо работающие программы UNIX, испускающие текстовые потоки).Использование подстановки команд удаляет эти завершающие символы новой строки, поэтому мы не храним их внутри переменных sunrise
и sunset
и, таким образом, повторно вводим их в echo
.