【问题标题】:Check if a condition is false检查条件是否为假
【发布时间】:2014-09-01 21:09:26
【问题描述】:

这似乎是一个简单的问题,我想知道为什么谷歌搜索没有提供任何帮助——在 StackOverflow 中也没有,在教程中也没有。我只需要使用 bash 检查条件是否为假。

在我的发现中我尝试过

if ! [ 0==2 ]; then echo Hello; fi

if [ ! 0==2 ]; then echo Hello; fi 

他们都不打印Hello

我只发现了两个类似的问题,但两种情况的最终答案都是重组代码以不使用“假”条件。

【问题讨论】:

  • 我建议你阅读manual page
  • [ 0 != 2 ] && echo "hello" 成功了。
  • @JoachimPileborg test 是一个完全独立的命令。 testif 有什么区别,比如我应该改用test
  • 如果您查看链接的手册页,您将看到[test 命令的别名。事实上,if 命令只是检查另一个命令的结果,在本例中是test 命令。这些天它可能都由 shell 内部处理,但你应该看到 if 只是一个普通命令,它反过来又调用另一个命令。
  • 我不同意 Joachim 将 if 视为命令的建议。 if 是 shell 语法中的一个关键字,它引入了一个条件子句。它强调不是一个命令。在某些时候,有人认为引入命令[ 是个好主意,这样if [ ... 在shell 中看起来是两个语法符号,但[ 不是 的一部分shell 语法。

标签: linux bash shell unix conditional-statements


【解决方案1】:

你的意思是:

if ! [ 0 == 2 ]; then
  echo Hello;
fi

等式运算符周围缺少空间。

这可能是阅读http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html 的时候了——尤其是关于 if then else 和操作符的部分。我写脚本的时候一般都会打开这个..

【讨论】:

  • 是的,工作!拜托,您能否为答案添加一点解释,为什么在我的情况下 ! 不起作用? IE。这个命令if [ 0==0 ]; then echo Hello; fi 工作正常,那是什么原因呢?
  • 这是遗留的 shell 语法,它在空格方面很脆弱。现在没有理由使用。
  • @YagamyLight 可能是因为test 运算符[ ... ] 检查表达式。 0==0 不是一个操作,而是一个表达式。尝试做[ gfhjg ]; echo $?,它会回答0(-> true),就像你写[ 1 == 1 ]; echo $?一样,同时如果你写[ 1 == 2 ]; echo $?,它会回答1(-> false)
  • @WilliamPursell 如果您希望您的用户能够灵活地使用更好、更小、更快的外壳 - 这是一个特定于 bash 的问题。我通常坚持#!/bin/bashshe-bang,因为我不使用任何其他shell 测试我的脚本。当然,在autoconfworld 中,您的评论是有道理的。
  • @WilliamPursell 因为无知是幸福,坚持石器时代工具的便携性是昂贵的。我建议您向 bash 开发人员投诉以删除非 POSIX shell 扩展。以及更好的 shell 的开发者。
【解决方案2】:

对于数学评估,请在 bash 中使用 (( ))。对于文本使用[[ ]]

if (( $i == 0 )); then
  echo "i is 0"
else
  echo "i is unequal 0"

Read more here about comparison operators in bash.

And more on double parenthesis

【讨论】:

    【解决方案3】:

    除了 bash 的数学计算之外,您还可以使用布尔表达式代替 if

    [max@localhost:~] $ (( 0 == 0 )) && echo True || echo False
    True
    [max@localhost:~] $ (( 0 != 0 )) && echo True || echo False
    False
    

    【讨论】:

      【解决方案4】:

      如果您使用test 命令 ([..]),您可以使用整数比较选项:-eq,等于,-ne,不等于。

      if [ 0 -eq 2 ]; then echo true ; else echo false ; fi # false
      if [ 0 -eq 0 ]; then echo true ; else echo false ; fi # true
      
      if [ 0 -ne 2 ]; then echo true ; else echo false ; fi # true
      if [ 0 -ne 0 ]; then echo true ; else echo false ; fi # false
      

      在 bash 中,运算符[...] 相当于test,这是一个检查文件类型和比较值的命令; test 是一个内部命令:如果你用type [ 询问你的shell,它会回答[ is a built in shell command。您通常也可以在 /usr/bin/[ 中找到二进制文件。

      概要是test EXPRESSION,您可以从man testinfo coreutils test invocation 阅读。

      省略的 EXPRESSION 默认为 false。否则,EXPRESSION 为真或假并设置退出状态。

      这是一个人的摘录,有助于更好地理解

      • ( 表达式 ) 表达式为真。所以很容易导致错误被认为是一个操作0==1。 (运算是0 == 1带空格,0==1是表达式)。

      • !表达式 表达式为假。

      • ...
      • INTEGER1 -eq INTEGER2 INTEGER1 等于 INTEGER2
      • INTEGER1 -ne INTEGER2 INTEGER1 不等于 INTEGER2

      您可以从info coreutils test invocation 了解测试的退出状态。

      退出状态:

       0 if the expression is true,
       1 if the expression is false,
       2 if an error occurred.
      

      【讨论】:

        猜你喜欢
        • 2011-01-03
        • 1970-01-01
        • 2011-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-12
        • 1970-01-01
        • 2013-04-19
        相关资源
        最近更新 更多