Bash中if条件为FALSE但$?返回0,原因是什么?
为何if语句中条件判断的返回值不影响后续$?的输出?
如下示例按预期输出1:
test -f /usr/bin echo "$?" #1
但为何以下示例输出0?
if [[ -f /usr/bin ]]; then echo "Inside if statement" # 该行从未执行 fi echo "$?" #0
已知$?表示最后执行命令的返回值,原本认为if语句隐式调用的test是最后执行的命令,因条件为假应返回1,但实际返回0,为何该行为与直接执行test时不同?
核心原因是**if语句本身是一个独立的命令**,它的返回值由整个语句的执行结果决定,而非内部的条件判断命令:
- 当
if的条件判断返回非0(比如这里[[ -f /usr/bin ]]判断失败,返回1),if会跳过then代码块,但if这个命令本身执行是成功的——它完整完成了“判断条件、跳过分支”的逻辑,因此if命令的返回值是0。 - 直接执行
test命令时,test就是最后执行的命令,它的返回值1会被$?直接捕获。
简单总结:$?记录的是最后一个执行完成的命令的返回值,第二个示例里最后执行的是if整个语句,而非内部的条件判断表达式。
内容的提问来源于stack exchange,提问作者Francisco J. Güemes Sevilla
相关产品推荐
相关产品推荐

