数字的绝对值

时间:2015-03-24 01:12:40

标签: bash shell unix

我想通过bash中的以下代码获取数字的绝对值:

#!/bin/bash
echo "Enter the first file name: "
read first

echo "Enter the second file name: "
read second

s1=$(stat --format=%s "$first")
s2=$(stat -c '%s' "$second")

res= expr $s2 - $s1

if [ "$res" -lt 0 ]
then
        res=$res \* -1
fi

echo $res

现在我面临的问题是在if语句中,无论我改变什么,它总是在if中,我试图将[[ ]]放在语句中但没有。

这是错误:

./p6.sh: line 13: [: : integer expression expected

4 个答案:

答案 0 :(得分:14)

您可以选择${var#-}

  

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

示例:

s2=5; s1=4
s3=$((s1-s2))

echo $s3
-1

echo ${s3#-}
1

答案 1 :(得分:5)

$ s2=5 s1=4
$ echo $s2 $s1
5 4
$ res= expr $s2 - $s1
1
$ echo $res

第四行实际发生的事情是res被设置为空并导出expr命令。因此,当您运行时[ "$res" -lt 0 ] res正在扩展为空,您会看到错误。

您可以使用arithmetic expression

$ (( res=s2-s1 ))
$ echo $res
1

算术上下文保证结果将是一个整数,所以即使你的所有术语都未定义,你也会得到一个整数结果(即零)。

$ (( res = whoknows - whocares )); echo $res
0

或者,你可以通过声明它来告诉shell res是一个整数:

$ declare -i res
$ res=s2-s1

这里有趣的是,作业的右侧是在算术上下文中处理的,所以你不需要$进行扩展。

答案 2 :(得分:0)

我知道这个线程在这一点上已经很老了,但是我想分享我编写的一个函数可以对此有所帮助:

abs() { 
    [[ $[ $@ ] -lt 0 ]] && echo "$[ ($@) * -1 ]" || echo "$[ $@ ]"
}

这将以任何数学/数字表达式作为参数并返回绝对值。例如:abs -4 => 4或abs 5-8 => 3

答案 3 :(得分:0)

一种解决方法:尝试消除负号。

  1. sed
x=-12
x=$( sed "s/-//" <<< $x )
echo $x

12
  1. parameter expansion
x=-12
[[ ${x:0:1} = '-' ]] && x=${x:1} || :
echo $x

12

此语法为ternary opeartor。冒号':'是do-nothing指令。

就我个人而言,当我以string开始时,对我而言脚本编写bash显得更容易。