Linux中test命令退出码为0时,为何if语句进入True分支?
为什么
test退出码0会让if进入True分支? 这是因为shell的if语句逻辑和常规编程语言的布尔判断完全不同,核心在于shell是基于命令的退出状态码来做判断的:
- 在Unix/Linux体系中,所有命令执行完成后都会返回一个退出状态码:
- 退出码
0表示命令执行成功/条件判断成立 - 非
0的退出码表示命令执行失败/条件判断不成立(不同的非0值还可以区分具体错误类型)
- 退出码
- shell的
if <command>结构,本质是执行<command>后,检查它的退出码:- 如果退出码是
0,就判定为"条件成立",进入then分支 - 如果退出码是非
0,则判定为"条件不成立",进入else分支
- 如果退出码是
而test命令(包括它的等价写法[ ])的设计完全贴合这个规则:
当test的条件判断成立时(比如test -d dir检测到目录存在),它会返回退出码0;当条件不成立时(目录不存在),返回非0的退出码。
结合你的脚本分析
第一个脚本
if test -d $HOME/dir then echo $? echo The directory exists. else echo $? echo The directory does not exist. fi
- 当目录存在时:
test -d $HOME/dir执行成功,返回0,shell的if判定条件成立,进入then分支,此时echo $?输出的就是test的退出码0 - 当目录不存在时:
test返回非0,if判定条件不成立,进入else分支,echo $?输出非0值
第二个脚本
test -d $HOME/dir exitcode=$(echo $?) if [ "$exitcode" -ne 0 ] then echo -e exit is $exitcode echo -e does not exist else echo -e exit is $exitcode echo -e exists fi exit
这里你手动捕获了test的退出码,然后用[ "$exitcode" -ne 0 ]做判断——注意[本身就是test的等价命令:
- 当
exitcode是非0(也就是test检测目录失败),[ "$exitcode" -ne 0 ]这个判断成立,返回0,所以if进入then分支,输出"不存在" - 当
exitcode是0(test检测目录成功),[ "$exitcode" -ne 0 ]判断不成立,返回非0,if进入else分支,输出"存在"
本质上还是遵循了shell的退出码判断规则,所以和第一个脚本结果一致。
简单总结:shell里的"真"对应命令执行成功(退出码0),"假"对应命令执行失败(退出码非0),test的设计完全适配这个逻辑,这和你熟悉的其他编程语言的布尔逻辑是相反的。
内容的提问来源于stack exchange,提问作者ChillyGrasp999
相关产品推荐
相关产品推荐

