您可以使用$((...)) 语法直接在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,这样可以确保结果始终为非负数。
如果您的需求是一次性的,并且定义一个函数对您来说似乎有点过头了,那么简单地将第二个函数的主体复制到需要它的地方可能是一种可行的选择。