在zsh中,如何根据程序的退出状态进行条件判断?

31

我想要做类似于以下的事情:

if [[ git status &> /dev/null ]]; then
   echo "is a git repo";
else
   echo "is not a git repo";
fi

除了我不知道如何检查退出状态,我应该如何解决这个问题?

3个回答

38
变量 $? 包含了最近一次命令的返回码。
编辑:具体示例:
git status &> /dev/null
if [ $? -eq 0 ]; then
  echo "git status exited successfully"
else
  echo "git status exited with error code"
fi

哦,对了,忘记了,>& 有时确实有效,取决于语法的模糊程度--不过这是个坏习惯,最好使用不含歧义的 &>。抱歉。 - Phil P
1
只是为了明确,git status 可以因为很多原因返回非零的退出代码,而不仅仅是 git 仓库不存在的情况。 - erb
当然。这个答案试图回答OP关于返回代码的zsh问题,我完全同意git的相关性很小。也许我会编辑一下。 - orip

26

就是这样简单

if git status &> /dev/null
then
   echo "is a git repo";
else
   echo "is not a git repo";
fi

或者更紧凑的形式:

git status &> /dev/null && echo "is a git repo" || echo "is not a git repo"

1
另一种我经常使用的表单如下:
git status &> /dev/null
if (( $? )) then
    desired behavior for nonzero exit status
else
    desired behavior for zero exit status
fi

这个答案比被接受的答案更加紧凑,但是不需要像gregseth的答案那样将命令放在同一行(有时候你想要这样做,但有时候会变得太难阅读)。
双括号用于zsh中的数学表达式。(例如,请参见here。)
编辑:请注意,(( expression ))语法遵循大多数编程语言的通常约定,即非零表达式计算为true,而零计算为false。其他替代方案([ expression ][[ expression ]]if expressiontest expression等)遵循通常的shell约定,即0(无错误)计算为true,非零值(错误)计算为false。因此,如果您使用此答案,则需要从其他答案切换ifelse子句。

2
实际上,在算术运算中,您不需要使用$符号来引用变量。请参阅http://www.bash2zsh.com/zsh_refcard/refcard.pdf:“`var`(前面不需要`$`,除非需要一些替换,例如`${#var}`,如果要修改`var`,则`$`是错误的)”。 - ericbn
2
请注意,这与上面的答案相反,如果返回代码为非零,则进入if块,如果返回代码为零,则进入else块。 - kevin.groat
@kevin.groat 谢谢,我忘了提到这个。现在加上它。 - sasquires

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接