2016-11-14 59 views
1

下面的bash脚本输出“ERROR!”而不是“服务器错误响应”,即使wget的回报8:由bash脚本中的比较运算符设置的退出状态

#!/bin/bash 

wget -q "www.google.com/unknown.html" 
if [ $? -eq 0 ] 
then 
    echo "Fetch successful!" 
elif [ $? -eq 8 ] 
then 
    echo "Server error response" 
else 
    echo "ERROR!" 
fi 

当脚本以上与-x运行,0的第一比较似乎退出状态被设置为1:

+ wget www.google.com/unknown.html 
+ '[' 8 -eq 0 ']' 
+ '[' 1 -eq 8 ']' 
+ echo 'ERROR!' 
ERROR! 

我通过使用一个用于存储wget退出状态的变量解决了这个问题,但是我找不到任何有关$的各种方法的参考。已设置。击细节:

$ bash --version 
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) 
Copyright (C) 2013 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later 
<http://gnu.org/licenses/gpl.html> 

This is free software; you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 

可能有人点我一个?

+0

'man wget |更少+/EXIT'? – Cyrus

回答

3

$?解释,虽然很短暂,在特殊参数的man bash参数部分:

?  Expands to the exit status of the most recently executed fore- 
      ground pipeline. 

@chepner把它最好在他的评论:

的关键需要了解的是,每个[ ... ]都是独立的前台管道,不是if语句语法的一部分,并且它们按顺序执行,随着时间的推移更新$?

如果你想使用的if-else链,然后保存在一个变量的$?的价值,并在该变量使用条件:

wget -q "www.google.com/unknown.html" 
x=$? 
if [ $x -eq 0 ] 
then 
    echo "Fetch successful!" 
elif [ $x -eq 8 ] 
then 
    echo "Server error response" 
else 
    echo "ERROR!" 
fi 

但在这个例子中,case会更实用:

wget -q "www.google.com/unknown.html" 
case $? in 
    0) 
     echo "Fetch successful!" ;; 
    8) 
     echo "Server error response" ;; 
    *) 
     echo "ERROR!" 
esac 
+1

要理解的关键是每个''''是一个单独的前台流水线,而不是'if'语句的语法的一部分,并且它们按顺序执行,随着时间的推移更新'$?'。 – chepner

+0

精美的,谢谢@chepner! – janos

+0

@chepner,谢谢! if条件是否是“管道”的参考?你从哪里了解到的? – swoop81

0

尝试在$上使用开关盒?或存储$?在一个变量中。

+0

谢谢,我知道如何解决问题(请参阅我原来的问题)。我只是想要一个手册页或参考资料,以上述的@chepner的说法来说明if条件是他们自己的前台流水线。 – swoop81