由bash脚本中的比较运算符设置的退出状态

时间:2016-11-14 21:03:43

标签: bash exit status setting

以下bash脚本打印“ERROR!”而不是“服务器错误响应”,即使wget返回8:

#!/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细节:

$ 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.

有人能指点我吗?

2 个答案:

答案 0 :(得分: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 :(得分:0)

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