当 Curl 下载不存在的文件失败时如何在 Bash 中检测?

当 Curl 下载不存在的文件失败时如何在 Bash 中检测?

我正在使用curl下载一个 zip 文件。curl从脚本中调用bash

curl --user joedoe http://1.2.3.4/files/joedoe.zip -o /tmp/downloaded.zip

我想检测目标 zip 文件是否存在。

我试过

if ! [[ $? == 0 ]] ; then
  echo "ERROR: problem with Curl."
  exit 1
fi ;

但似乎$?返回的curl0,所以我无法检测到 zip 文件何时不存在。

如何做呢?

答案1

这几乎是如果 HTTP 状态代码不是 200,我可以让 cURL 失败并且 exitCode 不为 0 吗?得票最多的答案(即我写这篇文章时最多赞成的人)建议-f。此解决方案将捕获4xx5xxHTML 错误代码,但不会301 Moved Permanently。在您的情况下,HTML 错误代码可能是也可能不是301

如果我是你,我会捕获并分析此代码。幸运的是,你curl使用-o并写入常规文件,而不是 stdout;因此我们可以使用 stdout 执行额外任务。-w这就是你所需要的:

http_code="$(curl --user joedoe -w '%{http_code}\n' -o /tmp/downloaded.zip http://1.2.3.4/files/joedoe.zip)"
exit_status="$?"

现在你有$exit_status $http_code分析。决定是否需要-f并相应地构建脚本的逻辑。基本上你想$http_code成为200。即使它是200,也请检查它是否$exit_status0。想象一下链接是好的,但您无法写入/tmp/downloaded.zip(也许有人在那里放了一个恶意文件,希望您会使用它)。这是一个示例案例,您可以200从服务器获取,但仍然会出现错误(非零$exit_statuscurl


即使$exit_status0并且$http_code200,您可能仍想检查 是否/tmp/downloaded.zip是有效的 zip 文件。基本测试可能是退出状态:

[ "$(file -b --mime-type /tmp/downloaded.zip)" = application/zip ]

(如果您file支持这些选项)。“完整”测试是通过检查退出状态进行的:

unzip -t /tmp/downloaded.zip

相关内容