为何fish shell中true等于0,而false却不等于1?
fish与bash中
true/false和数值比较差异的技术解释 核心原因:两种shell对条件表达式的解析逻辑完全不同
1. fish的解析逻辑
fish中,if语句的核心逻辑是执行后续命令,通过其退出码判断真假(退出码0为真,非0为假):
- 当你写
if true == 0时,fish会将true作为主命令,==和0作为它的参数。而fish内置的true命令会忽略所有传入参数,始终返回退出码0,因此整个条件等价于if true,结果为真,输出YES。 - 同理,
if false == 1中,内置的false命令同样忽略所有参数,始终返回退出码1(非0),条件等价于if false,结果为假,输出NO。
如果需要在fish中真正比较命令的退出码和数值,需使用保存上一个命令退出码的$status变量:
❯ true; if $status == 0; echo "YES"; else; echo "NO"; end YES ❯ false; if $status == 1; echo "YES"; else; echo "NO"; end YES
2. bash的解析逻辑
bash中,[ ... ]是test命令的别名,这里的==是字符串比较运算符:
[ true == 0 ]是直接对比字符串"true"和"0",二者不相等,因此条件为假,输出NO。[ false == 1 ]同理,对比字符串"false"和"1",结果不相等,输出NO。
若要在bash中检查命令的退出码,直接写if true(判断退出码0)或if ! false(判断退出码非0)即可,无需用[ ]做字符串比较。
内容的提问来源于stack exchange,提问作者robertspierre
相关产品推荐
相关产品推荐

