2015-07-13 87 views
4

我想在後續比較中使用比較結果。我試着這樣做:在另一個比較中使用bash比較的結果

# $1 - expected result 
# $2 - actual result 
function print_result() { 
    if [[ [[ $1 -eq 0 ]] -eq [[ $2 -eq 0 ]] ]]; then # invalid 
     echo "Pass" 
    else 
     echo "Fail" 
    fi 
} 

我可以得到更詳細的形式所需的行爲:

function print_result() { 
    if [[ (($1 -eq 0) && ($2 -eq 0)) || (($1 -ne 0) && ($2 -ne 0)) ]]; then 
     echo "Pass" 
    else 
     echo "Fail" 
    fi 
} 

但是看起來應該有一個更簡單的方法?

回答

2

您需要將比較運算符的結果作爲文本而不是狀態返回的內容。那將是arithmetic expansion$((expression))。也

注意的bash包括數字conditional compound statement - ((expr)) - 這通常是更容易使用比非數值[[ ... ]]條件複合語句的數值比較。

把一起,你正在尋找的是:

if (($(($1==0)) == $(($2==0)))); then 

或者只是:

if ((($1==0) == ($2==0))); then 

如果你只是想知道,如果$ 1和$ 2都爲0或兩個非零,那麼你可以使用這樣的事實:布爾型不是(!)總是計算爲0或1.因此,下面更簡單的表達式是等價的(但請參閱下面的警告):

if ((!$1 == !$2)); then 

重要提示:如果您在腳本中使用它,它將正常工作,但在命令提示符下,您需要在!之後放一個空格,以避免它被解釋爲history expansion字符(除非您已將歷史擴展關閉:如果你實際上沒有使用歷史擴展,關閉它並不是一個壞主意。)

1

是可能會更具有可讀性(但不是特別簡單)的方法是存儲在一個變量中的每個比較的結果,然後比較變量:

function print_result() { 
    [[ $1 -eq 0 ]]; arg_one_is_zero=$? 
    [[ $2 -eq 0 ]]; arg_two_is_zero=$? 
    if [[ $arg_one_is_zero -eq $arg_two_is_zero ]]; then 
     echo "Pass" 
    else 
     echo "Fail" 
    fi 
} 

有可能是存儲一個更好的辦法邏輯結果(退出代碼)在變量中進行比較,但在快速查找後我找不到一個結果。