如何在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中发生。它从历史记录中打印匹配的命令,然后运行它。