我正在使用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 ;
但似乎$?
返回的curl
是0
,所以我无法检测到 zip 文件何时不存在。
如何做呢?
答案1
这几乎是如果 HTTP 状态代码不是 200,我可以让 cURL 失败并且 exitCode 不为 0 吗?这得票最多的答案(即我写这篇文章时最多赞成的人)建议-f
。此解决方案将捕获4xx
或5xx
HTML 错误代码,但不会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_status
是0
。想象一下链接是好的,但您无法写入/tmp/downloaded.zip
(也许有人在那里放了一个恶意文件,希望您会使用它)。这是一个示例案例,您可以200
从服务器获取,但仍然会出现错误(非零$exit_status
)curl
。
即使$exit_status
是0
并且$http_code
是200
,您可能仍想检查 是否/tmp/downloaded.zip
是有效的 zip 文件。基本测试可能是退出状态:
[ "$(file -b --mime-type /tmp/downloaded.zip)" = application/zip ]
(如果您file
支持这些选项)。“完整”测试是通过检查退出状态进行的:
unzip -t /tmp/downloaded.zip