如果没有网络,curl 立即退出

如果没有网络,curl 立即退出

我想从 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

相关内容