bash shell script which adds output of commands

4

Let's say I have a command called foo which prints a number to the screen when called:

$ foo
3

Let's also say I have another command called bar which prints another number to the screen when called:

$ bar
5

I'm looking to write a shell script which will arithmetically add together the output of foo and bar (3+5=8). How would I do that? (The outputs from the commands are not known ahead of time. They just so happen to have been 3 and 5 the last time they were run. They could have been something else.)

John Kube

Posted 2010-04-22T17:22:42.547

Reputation: 219

2What do you mean by adding together? Are the program outputs always integers and you want 3+5=8 or are they strings and you want '3'+'5'='35'. – Benjamin Bannier – 2010-04-22T17:33:26.860

1they're integers, and I'm looking to add them (3+5=8), not concatenate them – John Kube – 2010-04-22T17:36:49.050

Answers

8

Use bash's let to evalutate arithmetric expressions.

#!/bin/bash
a=`echo 3`
b=`echo 5`

let c=$a+$b
echo $c

Just substitute the calls to echo with your program calls.

Benjamin Bannier

Posted 2010-04-22T17:22:42.547

Reputation: 13 999

You can omit the dollar signs in a let statement. – Paused until further notice. – 2010-04-22T22:34:19.533

@Dennis: I know, but this way it does at least seem consistent. The shortest way (sadly?) is often the most likely to confuse (cf. Perl ;) – Benjamin Bannier – 2010-04-22T22:48:22.497

1let is the devil. It feels like BASIC, and makes baby pandas cry. The double-paren mechanism doesn't harm pandas. ;) – dannysauer – 2010-11-12T00:58:46.327

3

An alternative to let is to use double-parenthesis syntax:

(( c = $(foo) + $(bar) ))

or

echo $(( $(foo) + $(bar) ))

or using variables, you can omit the dollar sign on the right hand side of the equals:

(( c += $(foo) + num ))

(which also illustrates an incremental assignment)

If you're using non-integers you can use bc:

echo "$(foo) + $(bar)" | bc

or

c=$(echo "$(foo) + $(bar)" | bc)

One advantage of using double parentheses is that you can put spaces around the operands and operators to make things more readable:

(( c = ( a + b ) * ( i - j ) ))

Paused until further notice.

Posted 2010-04-22T17:22:42.547

Reputation: 86 075

1

bash:

bc < <({ foo ; echo + ; bar ; } | tr '\n' ' ' ; echo)

If the output is integers only:

$(( $(foo) + $(bar) ))

Ignacio Vazquez-Abrams

Posted 2010-04-22T17:22:42.547

Reputation: 100 516