Mus*_*ode 5 command-line bash scripts
我想知道两者之间是否有区别
if [ $x -eq $y -o $x -eq 1 ]
if [ $x -eq $y ] || [ $x -eq 1 ]
Run Code Online (Sandbox Code Playgroud)
两者似乎都有效。谢谢
Ser*_*nyy 10
TL;DR:它们不一样,目的也略有不同,尽管它们的目标是相同的预期效果。
不同之处在于谁 进行逻辑检查。您可能知道,方括号与test命令同义。因此,当-o您看到单个测试命令时,将两个条件一起评估,然后将退出状态返回给 bash。
有了&&你有两个test语句,每个单独返回,但随后的bash求值,如果它们都是真实的。现在推荐最后一个,因为test它有点过时并且有问题(并且[[经常推荐新版本的测试,请参阅此),而且它的可读性要高得多,因为&&or||用于许多其他语言,包括 C 和 Java。
因此,在第一种情况下,[您评估两个表达式,评估两个命令的&&退出状态[。
附加信息:
正如@steeldriver 在评论中指出的,确实有内置的 command test,它是.bash的内部实现/usr/bin/test。不管这个事实,内置方式test和/usr/bin/test语法工作方式是完全相同的。
但是请记住,如果您使用的不是bashUbuntu 的默认 shell 或其他shell dash,那么您很可能会使用/usr/bin/test. ksh例如,Korn shell没有test内置。
还要记住的事实,&&并且test是不等价的:
test应该像任何其他命令一样评估语句并返回退出状态(请参阅POSIX 规范 test)。它有一整套你可以评估的东西——文件的存在、文件类型、整数和字符串比较。&&和等逻辑运算符||来评估单独命令的退出状态,就像 do 一样;,这是 bash 手册页中这些运算符位于Lists部分的原因之一。此外,它们不能是一个独立的命令,就像test- 它们是标准的 shell 列表操作符。所以,不像test你不能&&用来检查文件是否存在;您只能知道左侧的命令是成功退出还是失败退出,并相应地运行或不运行第二个命令。