否定bash脚本中的条件

时间:2014-10-20 21:36:36

标签: linux bash if-statement negate

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

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

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

5 个答案:

答案 0 :(得分:162)

您可以选择:

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

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

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

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

答案 1 :(得分:69)

更好的

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

答案 2 :(得分:8)

如果您感到懒惰,请在操作后使用||(或)和&&(和)处理条件的简洁方法:

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

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

答案 4 :(得分:4)

由于您正在比较数字,因此可以使用arithmetic expression,这样可以更简单地处理参数和比较:

return [
  "lvel1" => [
      "level2" => [
          "level3" => [
              1,
              85151,
              895151,
          ]
      ]
   ]
];

请注意,您可以使用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 specification不需要(尽管可能的扩展名称)。

总而言之,我认为最好完全避免$?,例如Cole's answerSteven's answer