我被困在试图否定以下命令:

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

如果我连接到互联网,这个if条件返回真。我希望它发生相反的方式,但放!哪里都不行。


你可以选择:

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

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

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

! 分别对下面表达式的返回值求反。


你可以用不相等的比较-ne代替-eq:

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

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

wget -q --tries=10 --timeout=20 --spider http://google.com || \
{ echo "Sorry you are Offline" && exit 1; }

更好的

if ! wget -q --spider --tries=10 --timeout=20 google.com
then
  echo 'Sorry you are Offline'
  exit 1
fi

因为你在比较数字,你可以使用算术表达式,这允许更简单的参数处理和比较:

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"

工作得很好。这不适用于$?这是一个特殊的参数。

此外,由于((…))将非零值计算为true,即非零值返回状态为0,否则返回状态为1,我们可以缩短为

if (( $? )); then

但这可能会让更多的人感到困惑,而不是保存按键的价值。

(…)构造在Bash中是可用的,但不是POSIX shell规范所要求的(尽管被提到为可能的扩展)。

综上所述,最好避免使用美元?在我看来,就像科尔和史蒂文的回答一样。