2016-05-23 29 views
1

是否有一個比較bash中兩個函數的退出碼的優雅方法?例如Bash:比較兩個函數的退出碼

b() 
{ 
    local r=$(rand -M 2 -s $(($(date +%s) + $1))); 
    echo "b$1=$r"; 
    return $r; 
} # just random boolean  
b1() { b 1; return $?; } # some boolean function 
b2() { b 2; return $?; } # another boolean function (another seed) 

我想用這樣的

if b1 == b2 ; then echo 'then'; else echo 'else'; fi 

,但堅持了這個「不異或」實施

if ! b1 && ! b2 || (b1 && b2) ; then echo 'then'; else echo 'else'; fi 

和口語更普遍,可以比較出算術兩個函數的代碼並在if語句中使用該比較?

+0

只是爲了澄清,你期望這個代碼'b 1;返回$?;'做什麼?由於運行'b 1'的結果並沒有保存在變量中,你希望通過運行它來實現什麼?另外,你認爲'$?'的價值意味着什麼? – John1024

+0

我期望b 1;返回$?;返回b 1的結果,即零或一,因爲$?是存儲上次執行的命令的退出代碼的變量。是的,我明白stdout和函數結果之間的區別; – Leonid

+0

Shell函數沒有返回值;它們具有退出狀態,具有明確定義的語義:'0'表示成功,其他任何非零值表示失敗。 – chepner

回答

1

比較的b1b2退出代碼:

b1; code1=$? 
b2; code2=$? 
[ "$code1" -eq "$code2" ] && echo "exit codes are equal" 

殼,像b1 == b2語句不能獨自站立。他們需要成爲test命令的一部分。 test命令通常編寫爲[...]。 另外,在shell中,=(或支持的==)用於字符串比較。 -eq用於數字比較。

+0

謝謝你的好解釋。順便說一下,據我瞭解,在'(())'建設中=='是用於數字比較。 – Leonid

+0

是的,在'((...))'裏面,'='是賦值,'=='是對等式的測試。構造體'((...))'提供了bash的完整算術能力。然而,這可能導致[令人不快的意外。](http://unix.stackexchange.com/questions/172103/security-implications-of-using-unsanitized-data-in-shell-arithmetic-evaluation)另一個區別是'[...]'是POSIX,因此可移植,但'((...))'不是。 – John1024