【问题标题】:How can I get absolute difference of two numbers?如何获得两个数字的绝对差?
【发布时间】:2015-02-10 18:03:45
【问题描述】:

是否有任何 bash/shell 命令可以获取两个数字的绝对差?例如-

-10 and -5 is 5-10 and 10 is 207 and 21 is 14100 and -11 is 111 的绝对差异。

或者有什么办法可以找到它?请帮忙。

【问题讨论】:

  • 如果你想要 shell 命令,为什么要标记Python
  • @thefourtheye 认为如果不是 bash,python 肯定会有所帮助!
  • 请在问题中也包含该信息。

标签: python bash shell awk


【解决方案1】:

这是一个简单的:

echo $(($1-$2)) | sed 's/-//'
./script.sh -10 -5

输出

5

逻辑很简单。您向脚本提供参数$1$2,例如 ./script.sh -10 -5 然后使用echo 输出$1 - $2 的结果。 sed 如果出现-,将删除它。

【讨论】:

  • @SandyElms- 请告诉我逻辑
【解决方案2】:

您可以使用$((...)) 语法直接在shell 中进行简单的整数运算。

function abs_diff {
    local diff
    diff=$(($1 - $2));
    if [ $diff -lt 0 ]
    then
        diff=$((-$diff))
    fi
    echo $diff
}

使用三元 ? 运算符,它可以更简洁地写成单个表达式。

function abs_diff {
    echo $(($1 >= $2 ? $1 - $2 : $2 - $1))
}

然后简单地使用

abs_diff -10 -5

在您的代码中。

更新: “如果你能解释一下逻辑就太好了。”——我们开始……

基本思想是我们编写一个 Bash 函数,它接受两个整数作为参数并返回它们的绝对差。

Bash 函数可以像外部程序一样使用FUNCTION_NAME [ARG...] 语法来调用。在函数内部,我们可以通过$1$2、……来引用它的参数,就像我们在任何函数之外引用 shell 脚本的参数一样。为了从函数中“返回”一个值,我们将其打印到标准输出。 (不要为此滥用return 语句。它旨在报告成功或失败,而不是业务数据。)如果我们想将函数调用的结果分配给变量,我们可以使用VAR=$(COMMAND [ARG...]) 语法.函数定义的语法为function FUNCTION_NAME { FUNCTION_BODY }。如果我们声明应该是函数本地的变量,我们可以使用local 关键字。这是一个 Bash 功能。

现在让我们看看如何计算差值的绝对值。我们只有整数算术,那么我们该怎么做呢?显然,如果我们从整数 m 中减去整数 n,则只有两种可能的结果:非负数或负数结果。在第一种情况下,我们完成了。其次,我们需要做的就是接受否定。

第一个函数正是这样做的。

function abs_diff {           # Define the function 'abs_diff'
    local diff                # with 'diff' as a local variable
    diff=$(($1 - $2));        # to compute the difference of its first two arguments
    if [ $diff -lt 0 ]        # and if it is negative
    then                      # then
        diff=$((-$diff))      # negate the result
    fi                        # and
    echo $diff                # finally print the result.
}

第二个版本更简洁。如果您知道例如来自 C 或 Java 的三元 ? 运算符,那么它就不足为奇了。这行是什么

echo $(($1 >= $2 ? $1 - $2 : $2 - $1))

意思是:如果$1 >= $2 计算结果为真,则打印$1 - $2,否则打印$2 - $1,这样可以确保结果始终为非负数。

如果您的需求是一次性的,并且定义一个函数对您来说似乎有点过头了,那么简单地将第二个函数的主体复制到需要它的地方可能是一种可行的选择。

【讨论】:

    【解决方案3】:

    这个 bash 实现怎么样:

    export A=5
    export B=10
    echo "$A-$B" | bc | tr -d -
    

    输出:

    5
    

    【讨论】:

      【解决方案4】:

      您可以使用-c parameter 从命令行执行 Python 命令。所以,你可以像这样使用它

      python -c "import sys; print(abs(int(sys.argv[1]) - int(sys.argv[2])))" 100 -11
      # 111
      

      此脚本从命令行获取两个参数,将它们都转换为整数,从第一个值中减去第二个值并打印结果的绝对值

      【讨论】:

        【解决方案5】:

        这也适用于非整数,也使用bc

        function abs_diff {
            if [ $(bc <<<"$1 >= $2") -eq 1 ]; then
                diff="$(echo $1 - $2 | bc)"
            else
                diff="$(echo $2 - $1 | bc)"
            fi
            
            echo $diff
        }
        
        abs_diff 5.0 1.0  #gives output: 4.0
        abs_diff 1.0 5.0  #gives output: 4.0
        

        【讨论】:

          【解决方案6】:

          您可以使用${var#-} 来完成此操作,而无需任何外部命令。

          ${var#Pattern}$var 中删除与$var 前端匹配的$Pattern 的最短部分。 tdlp


          例子:

          s2=7; s1=8
          s3=$((s1-s2))
          
          echo $s3
          -1
          
          echo ${s3#-}
          1
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-07-27
            • 2022-09-22
            • 2022-07-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多