209

我是 bash 的新手,我一直试图否定以下命令:

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
        echo "Sorry you are Offline"
        exit 1

如果我已连接到互联网,则此 if 条件返回 true。我希望它以相反的方式发生,但放在!任何地方似乎都不起作用。

4

5 回答 5

294

你可以选择:

if [[ $? -ne 0 ]]; then       # -ne: not equal

if ! [[ $? -eq 0 ]]; then     # -eq: equal

if [[ ! $? -eq 0 ]]; then

!分别反转以下表达式的返回。

于 2014-10-20T21:39:33.367 回答
107

更好的

if ! wget -q --spider --tries=10 --timeout=20 google.com
then
  echo 'Sorry you are Offline'
  exit 1
fi
于 2014-10-20T22:19:03.800 回答
9

如果你觉得懒惰,这里有一个在操作后使用||(or) 和&&(and) 处理条件的简洁方法:

wget -q --tries=10 --timeout=20 --spider http://google.com || \
{ echo "Sorry you are Offline" && exit 1; }
于 2014-10-20T21:59:15.607 回答
4

您可以使用不等比较-ne代替-eq

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -ne 0 ]]; then
    echo "Sorry you are Offline"
    exit 1
fi
于 2014-10-20T21:40:28.967 回答
4

由于您正在比较数字,因此您可以使用算术表达式,它允许更简单地处理参数和比较:

wget -q --tries=10 --timeout=20 --spider http://google.com
if (( $? != 0 )); then
    echo "Sorry you are Offline"
    exit 1
fi

请注意-ne,您可以只使用!=. 在算术上下文中,我们甚至不必预先$添加参数,即

var_a=1
var_b=2
(( var_a < var_b )) && echo "a is smaller"

工作得很好。但是,这不适用于$?特殊参数。

此外,由于(( ... ))将非零值评估为真,即非零值的返回状态为 0,否则返回状态为 1,我们可以缩短为

if (( $? )); then

但这可能会让更多的人感到困惑,而不是节省的击键值。

该构造在 Bash 中可用,但POSIX shell 规范(( ... ))不需要(尽管提到可能的扩展)。

$?综上所述,在我看来,最好完全避免,就像Cole's answerSteven's answer一样。

于 2016-06-04T21:29:05.010 回答