2013-07-03 106 views
7

我有一個腳本,檢查以下函數的返回狀態:如何測試中的Bash命令的非零退出狀態?

function is_git_repository {              
    git branch &> /dev/null              
} 

如果你在一個混帳回購協議是它返回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當我遇到問題的退出狀態。我試過以下,但他們沒有工作:

  1. if [[ "$(is_git_repository)" != "0" ]] ; ...結果始終爲true(link
  2. if [[ "$(is_git_repository)" -ne "0" ]] ; ...始終得到false
  3. if [[ "$(is_git_repository)" != 0 ]] ; ...結果始終爲true
  4. if [[ "$(is_git_repository)" -ne 0 ]] ; ...始終計算爲假
  5. if [[ ! "$(is_git_repository)" ]] ; ...始終評估爲真
  6. if !is_git_repository ; ...只是回聲c ommand回到我,但沒有爆炸(wtf?)

在if語句中檢查命令的非零退出狀態的正確方法是什麼?

+1

你似乎在尋找$? – devnull

+0

「源」您鏈接到既不接受,也不是最高的投票答案的問題。 –

回答

7

很快我就想通了,if ! is_git_repository ; then ...按預期工作(看7.1.2.1。測試在Introduction to if退出狀態下),但是爲什麼呢?我本來預計#1至少會起作用,但我不知道它爲什麼不起作用。

此外,什麼是了#6?

+3

當你說'「$(is_git_repository)」'你回來的命令*標準輸出*,而不是*退出狀態*。你重定向stdout和stderr,所以這總是空字符串,它總是不等於字符串「0」。 bash是空白敏感的,所以'!'需要獨立。正如@devnull所提到的,如果你想要退出狀態,你需要'$?'變量。 –

+0

@glennjackman謝謝!這解釋了它。那麼用'-ne'做什麼呢?爲什麼他們的評估與'!='不同? (也就是說,爲什麼空字符串與'-ne'等於「0」/ 0,而不等於「0」/ 0與'!='?) – 3cheesewheel

+1

[shell arithmetic](http:// www。 gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic)手冊的部分表示:「空值的計算結果爲0」。 –

1

考慮布爾快捷方式,而不是if聲明:

is_git_repository || echo you are NOT in a git repo 
相關問題