Bash 检查wget';s返回值

Bash 检查wget';s返回值,bash,if-statement,wget,Bash,If Statement,Wget,我正在编写一个脚本来下载一堆文件,我希望它在某个特定文件不存在时发出通知 r=`wget -q www.someurl.com` if [ $r -ne 0 ] then echo "Not there" else echo "OK" fi 但执行时会出现以下错误: /file:line 2:[:-ne:应为一元运算符 怎么了?$r是wget的文本输出(您用反勾号捕获了它)。要访问返回代码,请使用$?变量。wget ruffingthewitness.biz&&echo“我们成功了”|

我正在编写一个脚本来下载一堆文件,我希望它在某个特定文件不存在时发出通知

r=`wget -q www.someurl.com`
if [ $r -ne 0 ]
  then echo "Not there"
  else echo "OK"
fi
但执行时会出现以下错误:

/file:line 2:[:-ne:应为一元运算符


怎么了?

$r
是wget的文本输出(您用反勾号捕获了它)。要访问返回代码,请使用
$?
变量。

为空,因此如果[-ne 0],您的条件将变为
并且似乎将
-ne
用作一元运算符。请尝试以下操作:

wget -q www.someurl.com
if [ $? -ne 0 ]
  ...

编辑正如Andrew在我前面解释的那样,backticks返回标准输出,而
$?
返回上一次操作的退出代码。

其他人已经正确发布,您可以使用
$?
获取最新的退出代码:

wget_output=$(wget -q "$URL")
if [ $? -ne 0 ]; then
    ...
这可以让您捕获标准输出和退出代码。如果您实际上不关心它打印的内容,您可以直接测试它:

if wget -q "$URL"; then
    ...
如果要抑制输出,请执行以下操作:

if wget -q "$URL" > /dev/null; then
    ...
你可以

wget ruffingthewitness.com && echo "WE GOT IT" || echo "Failure"

-(~)----------------------------------------------------------(07:30 Tue Apr 27)
risk@DockMaster [2024] --> wget ruffingthewitness.com && echo "WE GOT IT" || echo "Failure" 
--2010-04-27 07:30:56--  http://ruffingthewitness.com/
Resolving ruffingthewitness.com... 69.56.251.239
Connecting to ruffingthewitness.com|69.56.251.239|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: `index.html.1'

    [ <=>                                                                                    ] 14,252      72.7K/s   in 0.2s    

2010-04-27 07:30:58 (72.7 KB/s) - `index.html.1' saved [14252]

WE GOT IT
-(~)-----------------------------------------------------------------------------------------------------------(07:30 Tue Apr 27)
risk@DockMaster [2025] --> wget ruffingthewitness.biz && echo "WE GOT IT" || echo "Failure"
--2010-04-27 07:31:05--  http://ruffingthewitness.biz/
Resolving ruffingthewitness.biz... failed: Name or service not known.
wget: unable to resolve host address `ruffingthewitness.biz'
zsh: exit 1     wget ruffingthewitness.biz
Failure
-(~)-----------------------------------------------------------------------------------------------------------(07:31 Tue Apr 27)
risk@DockMaster [2026] --> 
wget ruffingthewitness.com&&echo“我们成功了”| | echo“失败”
-(4月27日星期二07:30)
risk@DockMaster[2024]->wget ruffingthewitness.com&&echo“我们成功了”| | echo“失败”
--2010-04-27 07:30:56--  http://ruffingthewitness.com/
解析ruffingthewitness.com…69.56.251.239
正在连接到ruffingthewitness.com | 69.56.251.239 |:80…已连接。
HTTP请求已发送,正在等待响应…200确定
长度:未指定[text/html]
保存到:`index.html.1'
[]0.2s内14252 72.7K/s
2010-04-27 07:30:58(72.7kb/s)-'index.html.1'已保存[14252]
我们知道了
-(4月27日星期二07:30)
risk@DockMaster[2025]->wget ruffingthewitness.biz&&echo“我们成功了”| | echo“失败”
--2010-04-27 07:31:05--  http://ruffingthewitness.biz/
解析ruffingthewitness.biz…失败:名称或服务未知。
wget:无法解析主机地址'ruffingthewitness.biz'
zsh:1号出口wget ruffingthewitness.biz
失败
-(4月27日星期二07:31)
risk@DockMaster [2026] --> 

我一直在尝试所有解决方案,但没有幸运

wget以非交互方式执行。这意味着wget在后台工作,并且您不能用$

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


注意:wget需要一些时间来完成他的工作,因此我把“sleep 5”放在这里。这不是最好的方法,但对于测试解决方案来说效果不错。

从wget捕获结果并检查呼叫状态的最好方法

wget -O filename URL
if [[ $? -ne 0 ]]; then
    echo "wget failed"
    exit 1; 
fi
通过这种方式,您可以检查wget的状态以及存储输出数据

  • 如果调用成功,则使用存储的输出

  • 否则它将退出,错误为wget failed


  • 这是解释询问者为什么会收到错误消息的唯一答案。+1.使用此表单时,
    if
    将获得程序的退出代码是标准的吗?(
    if;then…
    )虽然这是正确的,但更好的解释应该是为什么
    $r
    为空以及为什么会出现错误消息。不鼓励只使用代码的答案。请写一些解释说明它是如何工作的?
    wget -O filename URL
    if [[ $? -ne 0 ]]; then
        echo "wget failed"
        exit 1; 
    fi