2015-07-13 90 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 
} 

有可能是存储一个更好的办法逻辑结果(退出代码)在变量中进行比较,但在快速查找后我找不到一个结果。