我想从 github 获取一些 api。
所以这是代码
array=(link1 link2 link3 link4)
readarray -t item < <(for i in ${array[@]}
do curl -s "$i" | jq '.tag_name'
done)
然后我可以从物品。
但问题是,如果还有一些链接需要获取,curl 就会卡在那里。
我希望它立即退出,而不是以前的数据,我需要它打印一些文本,如“错误”或获取其退出代码,以便我可以在发生任何失败时实现一些逻辑。
为此提供有效的解决方案。
答案1
您可以通过一次curl
调用读取所有 URL,并使用选项--fail-early
在第一次检测到传输错误时立即退出。如果您想限制连接时间,请添加--max-time
在 x 秒后中止每次传输。--connect-timeout
如果出现错误,项目数组将为空,您可以检查一下。
urls=(link1 link2 link3 link4)
readarray -t item < <(
curl -s --fail-early --connect-timeout 10 --max-time 120 "${urls[@]}" |
jq '.tag_name')
if [ "${#item[@]}" -eq 0 ]; then
echo "Uh, failed to fetch data." >&2
exit 1
fi
答案2
curl -f
如果响应代码大于或等于 400,您可以使用选项立即退出。此外,您还可以添加-w
捕获退出代码的选项和-o
重定向输出的选项,以/dev/null
避免将响应打印到控制台。
array=(link1 link2 link3 link4)
for i in "${array[@]}"
do
response=$(curl -f -w '%{http_code}' -o /dev/null "$i")
if [ "$response" -ge 400 ]; then
echo "error"
else
curl -s "$i" | jq '.tag_name'
fi
done