65

I am trying to divide two var in bash, this is what I've got:

var1=3;
var2=4;

echo ($var1/$var2)

I always get a syntax error. Does anyone knows what's wrong?

Tom Fenech
  • 72,334
  • 12
  • 107
  • 141
Mathias Verhoeven
  • 927
  • 2
  • 10
  • 24
  • The actual issue here is the mistake (subshell/arithmetic syntax). After fixing that, there's the integer division issue: [Bash Division Keeps giving 0 - Stack Overflow](https://stackoverflow.com/questions/45515025/bash-division-keeps-giving-0) – user202729 Oct 05 '21 at 23:57

5 Answers5

108

shell parsing is useful only for integer division:

var1=8
var2=4
echo $((var1 / var2))

output: 2

instead your example:

var1=3
var2=4
echo $((var1 / var2))

ouput: 0

it's better to use bc:

echo "scale=2 ; $var1 / $var2" | bc

output: .75

scale is the precision required

m47730
  • 2,061
  • 2
  • 24
  • 30
25

If you want to do it without bc, you could use awk:

$ awk -v var1=3 -v var2=4 'BEGIN { print  ( var1 / var2 ) }'
0.75
rouble
  • 16,364
  • 16
  • 107
  • 102
18

There are two possible answers here.

To perform integer division, you can use the shell:

$ echo $(( var1 / var2 ))
0

The $(( ... )) syntax is known as an arithmetic expansion.

For floating point division, you need to use another tool, such as bc:

$ bc <<<"scale=2; $var1 / $var2"
.75

The scale=2 statement sets the precision of the output to 2 decimal places.

Tom Fenech
  • 72,334
  • 12
  • 107
  • 141
  • 1
    P.S. in my .zshrc, I have `calc () { echo "scale=2;$*" | bc | sed 's/\.0*$//'}` to do calculations. The latter `sed` is to remove trailing zeros, E.g. `100/10` we get `10` instead of `10.00`... – Kent May 22 '15 at 13:47
2
#!/bin/bash
var1=10
var2=5
echo $((var1/var2))
2

You can also use Python for this task.
Type python -c "print( $var1 / float($var2) )"

Puspam
  • 2,137
  • 2
  • 12
  • 35
  • This is honestly the simplest solution I could get working. The `bc` solution wasn't working at all for me. – muad-dweeb Jun 09 '22 at 22:28