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

$ foo

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

$ bar

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

  • 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'. 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

Use bash's let to evalutate arithmetric expressions.

a=`echo 3`
b=`echo 5`

let c=$a+$b
echo $c

Just substitute the calls to echo with your program calls.

  • You can omit the dollar signs in a let statement. 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 ;) Apr 22 '10 at 22:48
  • 1
    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

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

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


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


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 ) ))


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

If the output is integers only:

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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