如何在Bash中测试命令的非零退出状态?
我有一个脚本,用于检查以下函数的退出状态:如何在Bash中测试命令的非零退出状态?,bash,shell,if-statement,exit-code,Bash,Shell,If Statement,Exit Code,我有一个脚本,用于检查以下函数的退出状态: function is_git_repository { git branch &> /dev/null } 如果您是git回购,则返回0,如果您不是,则返回128 我可以测试返回值是否为0;以下工作如预期: if i
function is_git_repository {
git branch &> /dev/null
}
如果您是git回购,则返回0
,如果您不是,则返回128
我可以测试返回值是否为0
;以下工作如预期:
if is_git_repository ; then
echo you are in a git repo
else
echo you are NOT in a git repo
fi
但当我遇到问题时,我正试图测试退出状态,而不是0
。我尝试过以下方法,但都不起作用:
if[[“$(is_git_repository)”!=“0”]代码>始终计算为true()
if[[“$(is_git_repository)”-ne“0”]代码>总是计算为false
如果[[“$(is_git_repository)!=0]]代码>始终计算为true
if[[“$(is_git_repository)”-ne 0]]代码>总是计算为false
if[[!”$(is_git_repository)]]代码>始终计算为true
if!是_git_repository代码>只是将命令回显给我,但没有砰的一声(wtf?)
检查if语句中命令的非零退出状态的正确方法是什么?我很快就发现
if!is_git_存储库;然后…
按预期工作(请参见中的测试退出状态下的7.1.2.1),但为什么?我本以为#1至少能起作用,但我不知道为什么不行
还有,6号是怎么回事 考虑布尔快捷方式,而不是
if
语句:
is_git_repository || echo you are NOT in a git repo
您似乎在寻找$?您链接到的“源”既不是该问题的已接受答案,也不是投票率最高的答案。当您说
“$(is\u git\u repository)”
时,您返回的是命令的标准输出,而不是退出状态。您重定向stdout和stderr,因此这始终是空字符串,它始终不等于字符串“0”。bash对空格敏感,因此代码>需要独立。正如@devnull提到的,如果您想要退出状态,您需要$?
变量。@glennjackman谢谢!这就解释了。但是那些带有-ne
的呢?为什么它们的评估结果与使用的不同=代码>?(即,为什么空字符串在-ne
中“等于”为“0”/0,但在!=
中不等于“0”/0?”)手册的一节说:“空值的计算结果为0。”#6是历史扩展,仅在交互式shell中发生。它从历史记录中打印匹配的命令,然后运行它。