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 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.) Thanks!

link|improve this question

2  
What 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'. – honk Apr 22 '10 at 17:33
1  
they're integers, and I'm looking to add them (3+5=8), not concatenate them – John Kube Apr 22 '10 at 17:36
feedback

3 Answers

up vote 7 down vote accepted

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.

link|improve this answer
You can omit the dollar signs in a let statement. – Dennis Williamson Apr 22 '10 at 22:34
@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 ;) – honk Apr 22 '10 at 22:48
let is the devil. It feels like BASIC, and makes baby pandas cry. The double-paren mechanism doesn't harm pandas. ;) – dannysauer Nov 12 '10 at 0:58
feedback

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 ) ))
link|improve this answer
feedback

bash:

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

If the output is integers only:

$(( $(foo) + $(bar) ))
link|improve this answer
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.