我想知道
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
语法的工作方式完全相同。
但请记住,如果您使用的是除bash
Ubuntu 默认 shell之外的其他 shell dash
,那么您很可能会使用/usr/bin/test
。ksh
例如,Korn shell 没有test
内置。
还要记住的&&
是test
不是相等的:
test
应该像其他命令一样评估语句并返回退出状态(参见POSIX 测试规范)。它有一整套你可以评估的内容——文件的存在性、文件类型、整数和字符串比较。- shell 使用逻辑运算符(例如
&&
和)来评估单独命令的退出状态,就像does 一样,这也是 bash 手册页将这些运算符归入第节的原因之一。此外,它们不能是独立命令,例如- 它们是||
;
Lists
test
标准 shell 列表运算符。因此,与test
您不能用来&&
检查文件是否存在不同;您只能知道左边的命令是成功退出还是失败,并据此运行或不运行第二个命令。
答案2
我能看到的唯一区别是,第一个命令将作为单个进程([
,又名test
)工作,而如果第一个命令返回非零,则第二个命令可能会产生两个进程。
除此之外,没有根本区别。