Bash 中两种条件评估方法有什么区别

Bash 中两种条件评估方法有什么区别

我想知道

if [ $x -eq $y -o $x -eq 1 ]
if [ $x -eq $y ] || [ $x -eq 1 ]

两种方法似乎都有效。谢谢

答案1

总结:它们并不相同,目的也略有不同,尽管它们旨在达到相同的效果。

不同之处在于WHO 进行逻辑检查。您可能知道,方括号与test命令同义。因此,-o您会看到单个测试命令,并且两个条件一起评估,然后将退出状态返回给 bash。

&&两个test语句,每个语句都单独返回,但 bash 会评估它们是否都为真。现在建议使用最后一个,因为test它有点过时并且存在问题(并且[[经常建议使用新版本的 test,请参阅),而且它的可读性更强,因为&&||在包括 C 和 Java 在内的许多其他语言中也有使用。

因此,在第一种情况下,[您需要评估两个表达式,并&&评估两个[命令的退出状态。

附加信息

正如@steeldriver在评论中指出的那样,确实存在内置命令test,它是bash的内部实现/usr/bin/test。无论这一事实如何,内置test/usr/bin/test语法的工作方式完全相同。

但请记住,如果您使用的是除bashUbuntu 默认 shell之外的其他 shell dash,那么您很可能会使用/usr/bin/testksh例如,Korn shell 没有test内置。

还要记住的&&test不是相等的:

  • test应该像其他命令一样评估语句并返回退出状态(参见POSIX 测试规范)。它有一整套你可以评估的内容——文件的存在性、文件类型、整数和字符串比较。
  • shell 使用逻辑运算符(例如&&和)来评估单独命令的退出状态,就像does 一样,这也是 bash 手册页将这些运算符归入第节的原因之一。此外,它们不能是独立命令,例如- 它们是||;Liststest标准 shell 列表运算符。因此,与test您不能用来&&检查文件是否存在不同;您只能知道左边的命令是成功退出还是失败,并据此运行或不运行第二个命令。

答案2

我能看到的唯一区别是,第一个命令将作为单个进程([,又名test)工作,而如果第一个命令返回非零,则第二个命令可能会产生两个进程。

除此之外,没有根本区别。

相关内容