Absolute value of a number

You might just take ${var#-}.

${var#Pattern} Remove from $var the shortest part of $Pattern that matches the front end of $var. tdlp


Example:

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

echo $s3
-1

echo ${s3#-}
1

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

What's actually happening on the fourth line is that res is being set to nothing and exported for the expr command. Thus, when you run [ "$res" -lt 0 ] res is expanding to nothing and you see the error.

You could just use an arithmetic expression:

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

Arithmetic context guarantees the result will be an integer, so even if all your terms are undefined to begin with, you will get an integer result (namely zero).

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

Alternatively, you can tell the shell that res is an integer by declaring it as such:

$ declare -i res
$ res=s2-s1

The interesting thing here is that the right hand side of an assignment is treated in arithmetic context, so you don't need the $ for the expansions.

Tags:

Unix

Shell

Bash