使用错误级别的bash输出wget

8
我希望创建一个bash文件(.sh),实现以下功能:
我可以像这样调用脚本:./download.sh www.blabla.com/bla.jpg
然后,脚本需要输出文件是否已经下载完毕...
我该怎么做?我知道可以使用错误级别(errorlevel),但是我对Linux还很陌生...
谢谢!
3个回答

7

通常在Linux中,应用程序会在失败时设置环境变量$?的值。您可以检查此返回代码,看看是否有任何关于wget的错误。

#!/bin/bash
wget $1 2>/dev/null
export RC=$?
if [ "$RC" = "0" ]; then
   echo $1 OK
else
    echo $1 FAILED
fi

您可以将此脚本命名为download.sh。使用chmod 755更改权限。使用您希望下载的文件名称调用它。./download.sh www.google.com

好的,你能给我一个例子吗?当文件下载完成后,脚本会输出“OK”,否则会输出类似于“FAILED”的信息。 - CyberK
1
将脚本改为包含OK和FAILED。使其成为更好的示例。 - ojblass
@CyberK:你可能也想要抑制wget的输出:wget $1 2>/dev/null - thejh
没有必要导出那个变量。实际上,也不需要一个变量:if [ $? = 0 ] - Dennis Williamson

4
你可以尝试这样做:

你可以尝试以下方法:

#!/bin/sh

[ -n $1 ] || {
    echo "Usage: $0 [url to file to get]" >&2
    exit 1
}

wget $1

[ $? ] && {
  echo "Could not download $1" | mail -s "Uh Oh" you@yourdomain.com
  echo "Aww snap ..." >&2
  exit 1
}

# If we're here, it downloaded successfully, and will exit with a normal status

当编写一个脚本,可能会被其他脚本调用时,重要的是要做到以下几点:

  • 确保参数正常
  • 发送电子邮件、写入日志或执行其他操作,以便有人知道出了什么问题

>&2 只是将错误消息的输出重定向到 stderror,这使得调用脚本可以执行如下操作:

foo-downloader >/dev/null 2>/some/log/file.txt

由于这只是一个简短的包装,没有理由牺牲一点理智 :)

这也使您能够有选择性地将 wget 的输出定向到 /dev/null,尤其在测试时,您可能确实希望看到它,特别是如果您收到一封失败的电子邮件 :)


0

wget以非交互方式执行。这意味着wget在后台工作,您无法使用$?捕获返回代码。

一种解决方案是处理“--server-response”属性,搜索http 200状态代码示例:

wget --server-response -q -o wgetOut http://www.someurl.com
sleep 5
_wgetHttpCode=`cat wgetOut | gawk '/HTTP/{ print $2 }'`
if [ "$_wgetHttpCode" != "200" ]; then
    echo "[Error] `cat wgetOut`"
fi

注意:wget需要一些时间来完成它的工作,因此我加了“sleep 5”。这不是最好的方法,但对于测试解决方案还可以。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接