检查条件是否为假

41

这似乎是一个简单的问题,我想知道为什么googling没有给出有用的结果——无论是在StackOverflow上还是在教程中。我只需要使用bash检查条件是否为false。

根据我发现的内容,我尝试了

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

他们都没有打印出Hello

我只找到两个类似的问题,但在这两种情况下,最终的答案都是重新构造代码以不使用“false”条件。


1
[ 0 != 2 ] && echo "hello" 这样就实现了。 - fedorqui
2
如果您查看链接的手册页面,您会发现 [test 命令的别名。实际上,if 命令只是检查另一个命令的结果,即 test 命令的结果。这些天可能都由 shell 内部处理,但您应该将 if 视为普通命令,它反过来调用另一个命令。 - Some programmer dude
== 不等于 = - Some programmer dude
@JoachimPileborg 对不起,那是打错了。我是指在注释中。 - Hi-Angel
1
我不同意Joachim将if视为一个命令的建议。if是shell语法中引入条件子句的关键字。它绝对不是命令。在某个时候,有人认为引入命令[是个好主意,这样if [...]将出现在shell中的两个语法符号中,但[不是shell语法的一部分。 - William Pursell
显示剩余3条评论
4个回答

69

你的意思是:

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

您在等号运算符周围缺少空格。

现在可能是阅读http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html的时候了 - 特别是有关if then else和运算符的部分。当我编写脚本时,通常会将其打开。


2
这是遗留的 shell 语法,对于空格非常脆弱。现在没有使用的理由。 - Maxim Egorushkin
2
@YagamyLight 可能是因为 test 运算符 [ ... ] 检查表达式。0==0 不是操作而是表达式。尝试执行 [ gfhjg ]; echo $?,它将回答 0(-> 真),就像你写 [ 1 == 1 ]; echo $? 一样,而如果你写 [ 1 == 2 ]; echo $? 它将回答 1(-> 假)。 - Hastur
@Maxim 有很多使用[test的好理由,主要是因为它们是标准的。根据Shell标准,使用[[会产生未指定的结果。如果你希望用户能够灵活地使用更好、更小、更快的Shell(例如,能够根据他们正在使用的应用程序选择合适的工具),Shell脚本就不能使用[[ - William Pursell
1
如果你想让用户有更好、更小、更快的shell使用灵活性,这是一个特定于bash的问题。我通常会使用#!/bin/bash she-bang,因为我不会用其他shell测试我的脚本。当然,在autoconf世界中,你的评论是有意义的。 - Maxim Egorushkin
1
@WilliamPursell 因为无知是幸福的,而通过坚持使用石器时代的工具来实现可移植性是昂贵的。我建议你向bash开发人员抱怨删除非POSIX shell扩展名。以及更好的shell的开发人员。 - Maxim Egorushkin
显示剩余5条评论

10

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是一个内部命令:如果你询问你的shell,使用type [命令,它将回答[ 是一个内置的shell命令。通常也可以在/usr/bin/ [找到二进制文件。

SYNOPSIS是test EXPRESSION,你可以从man test或者info coreutils test invocation中了解到。

省略的表达式默认为false。否则,表达式为true或false并设置退出状态。

这是来自man的节选,可以帮助更好地理解:

  • ( 表达式 ) 表达式为真。因此很容易犯错误认为0==1是操作(该操作是带有空格的0 == 10==1是一种表达式)。

  • ! 表达式 表达式为假。

  • ...
  • 整数1 -eq 整数2 整数1等于整数2
  • 整数1 -ne 整数2 整数1不等于整数2

info coreutils test invocation可以了解到关于test命令退出状态的更多信息。

退出状态:

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

4
除了bash的数学计算,您还可以使用布尔表达式而不是if
[max@localhost:~] $ (( 0 == 0 )) && echo True || echo False
True
[max@localhost:~] $ (( 0 != 0 )) && echo True || echo False
False

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接