我的代码
#!/bin/bash
echo "Sunrise is expected at"
curl -X GET 'https://api.sunrise-sunset.org/json?lat=36.7201600&lng=-4.4203400' | jq '.results.sunrise' | tr -d '"'
echo "and sunset at"
curl -X GET 'https://api.sunrise-sunset.org/json?lat=36.7201600&lng=-4.4203400' | jq '.results.sunset' | tr -d '"'
echo "."
我要打印:
Sunrise is expected at 5:12:13 AM and sunset at 6:26:23 PM.
但是我有这个:
Sunrise is expected at
5:12:13
AM and sunset at
6:26:23 PM
答案 0 :(得分:3)
这里根本没有使用多个echo
,并且当每个结果中都包含了所需的所有数据时,确定毫无意义地向API发出两个请求。 / p>
#!/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
的{{1}}参数来告诉它输出“原始字符串”-这就是为什么这里不需要jq
的原因。另外,由于tr
在每个参数后面放置换行符,因此,每行所需的输出仅应运行echo
。 (echo
参数可以在某些版本中取消此操作,但是依靠它是不安全的;在不需要尾随换行符时,最好使用-n
。)
printf '%s' ...
类似地在每一行输出之后都写一个换行符(因为所有行为良好的UNIX程序都会发出文本流)。使用command substitution会删除这些尾随的换行符,因此我们不会将它们存储在jq
和sunrise
变量中,因此不会在sunset
中引入它们。