我正在编写一个shell脚本,我需要从互联网下载6个文件,在脚本中我已经完成了
curl a
curl b
curl c
and so on
它可以工作,但有时curl: (7) couldn't connect to host
脚本中间的某些文件,例如,它将成功下载a,但错过了出现上述错误的文件b,并将下载文件c。我想捕获此错误,以便我的代码将在成功下载所有文件的情况下执行。
您可以使用循环:
while true; do
curl --fail b && break
done
在下载 b 之前,循环不会中断。您可以将其设置为重试函数,如果第一次尝试下载失败,则可以调用该函数:
retry(){
while true; do
curl --fail "$1" && break ||
echo "Download failed for url: $1
retrying..."
done
}
然后这样做:
curl --fail a || retry a
curl --fail b || retry b
curl --fail c || retry c
如果您只想使错误消息静音,则:
curl a 2>/dev/null
curl b 2>/dev/null
...
或者,如果您只想检测错误,则:
if ! curl --fail a; then
echo "Failed"
fi
或者,一行:
curl --fail a || echo Failed
如果要在失败后退出并显示自己的消息:
curl --fail a 2>/dev/null || { echo failed; exit 1; }
你可以用&&
链接它们...
curl --fail a && curl --fail b && curl --fail c...
更新:正如下面@nwk指出的,我们需要添加--fail
以使 curl 在错误的 http 代码上失败。
把set -e
放在 shell 脚本的开头并使用 curl --fail
. 例如,
#!/bin/sh
set -e
curl --fail http://example.com/a
curl --fail http://example.com/b
curl --fail http://example.com/c
set -e
将使脚本停止,并在第一个不成功的命令(退出状态为零≠命令)上出现错误。
您可以通过查看 $?
shell 变量来检查最后一个命令的执行状态。 执行下面的命令以检查最后一个命令的状态,其他任何 0 都应指示错误。
echo $?
curl a
if [ "$?" -gt 0 ]
then
echo "Error downloading file a. Exiting"
exit
fi
curl b
if [ "$?" -gt 0 ]
then
echo "Error downloading file b. Exiting"
exit
fi
...
@andlrc建议后的简单修改形式:
if ! curl a ; then echo "Got error downloading a"; fi
if ! curl b ; then echo "Got error downloading b"; fi
if ! curl c ; then echo "Got error downloading c"; fi
for file2get in a b c d;做 做:; 直到卷曲 --失败 $file 2get;做
或者添加迭代器计数器以防止无限循环