如何在Bash中测试命令的非零退出状态?

3ch*_*eel 7 bash shell if-statement exit-code

我有一个脚本,检查以下功能的退出状态:

function is_git_repository {                                                    
    git branch &> /dev/null                                                     
}  
Run Code Online (Sandbox Code Playgroud)

0如果您使用的是git仓库,那么会返回,128如果您不是.

我测试返回值是否有问题0; 以下按预期工作:

if is_git_repository ; then 
    echo you are in a git repo
else 
    echo you are NOT in a git repo
fi
Run Code Online (Sandbox Code Playgroud)

但是,当我试图测试退出状态时,除了0我遇到问题时,这是其他任何事情.我尝试了以下,但没有一个工作:

  1. if [[ "$(is_git_repository)" != "0" ]] ; ...总是评估为真(链接)
  2. if [[ "$(is_git_repository)" -ne "0" ]] ; ... 总是评估为假
  3. if [[ "$(is_git_repository)" != 0 ]] ; ... 总是评估为真
  4. if [[ "$(is_git_repository)" -ne 0 ]] ; ... 总是评估为假
  5. if [[ ! "$(is_git_repository)" ]] ; ... 总是评估为真
  6. if !is_git_repository ; ... 只是将命令回复给我,但没有爆炸(wtf?)

在if语句中检查命令的非零退出状态的正确方法是什么?

3ch*_*eel 8

我很快发现它if ! is_git_repository ; then ...按预期工作(请参阅7.1.2.1.简介if中测试退出状态),但为什么呢?我本以为#1至少会起作用,但我不知道它为什么没有.

另外,#6是什么?!

  • 当你说"$(is_git_repository)"时,你得到命令的*标准输出*,而不是*退出状态*.您重定向stdout和stderr,因此始终是空字符串,它始终不等于字符串"0".bash是空白敏感的所以`!`需要独立.正如@devnull所提到的,如果你想要退出状态,你需要`$?`变量. (3认同)

Chr*_*ph2 6

考虑布尔快捷方式而不是if语句:

is_git_repository || echo you are NOT in a git repo
Run Code Online (Sandbox Code Playgroud)