在另一个比较中使用bash比较的结果

时间:2015-07-13 04:18:50

标签: linux 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 个答案:

答案 0 :(得分:2)

您需要将比较运算符的结果生成为文本而不是状态返回的内容。那将是arithmetic expansion$((expression))

另请注意,bash包含数字conditional compound statement - (( expr )) - 与非数字[[ ... ]]条件复合语句相比,它通常更易于用于数字比较。

把它们放在一起,你要找的是:

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

或者只是:

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

如果您只想知道$ 1和$ 2是否为零或两者都是非零,那么您可以使用boolean not(!)始终求值为0或1的事实。因此,以下更简单的表达式是等效的(但请参见下面的警告):

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

重要提示:如果您在脚本中使用它,它将正常工作,但在命令提示符处,您需要在!之后放置一个空格,以避免将其解释为history expansion字符(除非你关闭了历史扩展:如果你实际上没有使用历史扩展,那么关闭它并不是一个坏主意。)

答案 1 :(得分: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
}

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