If you run a graphical desktop environment, you probably point and click your way to a calculator when you need one. The Fedora Workstation, for example, includes the Calculator tool. It features several different operating modes that allow you to do, for example, complex math or financial calculations. But did you know the command line also offers a similar calculator called *bc*?

The *bc* utility gives you everything you expect from a scientific, financial, or even simple calculator. What’s more, it can be scripted from the command line if needed. This allows you to use it in shell scripts, in case you need to do more complex math.

Because *bc* is used by some other system software, like CUPS printing services, it’s probably installed on your Fedora system already. You can check with this command:

dnf list installed bc

If you don’t see it for some reason, you can install the package with this command:

sudo dnf install bc

## Doing simple math with bc

One way to use *bc* is to enter the calculator’s own shell. There you can run many calculations in a row. When you enter, the first thing that appears is a notice about the program:

$ bc bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'.

Now you can type in calculations or commands, one per line:

1+1

The calculator helpfully answers:

2

You can perform other commands here. You can use addition (+), subtraction (-), multiplication (*), division (/), parentheses, exponents (^), and so forth. Note that the calculator respects all expected conventions such as order of operations. Try these examples:

(4+7)*2 4+7*2

To exit, send the “end of input” signal with the key combination *Ctrl+D*.

Another way is to use the echo command to send calculations or commands. Here’s the calculator equivalent of “Hello, world,” using the shell’s pipe function (|) to send output from *echo* into *bc*:

echo '1+1' | bc

You can send more than one calculation using the shell pipe, with a semicolon to separate entries. The results are returned on separate lines.

echo '1+1; 2+2' | bc

## Scale

The *bc* calculator uses the concept of *scale*, or the number of digits after a decimal point, in some calculations. The default scale is 0. Division operations always use the scale setting. So if you don’t set scale, you may get unexpected answers:

echo '3/2' | bc echo 'scale=3; 3/2' | bc

Multiplication uses a more complex decision for scale:

echo '3*2' | bc echo '3*2.0' | bc

Meanwhile, addition and subtraction are more as expected:

echo '7-4.15' | bc

## Other base number systems

Another useful function is the ability to use number systems other than base-10 (decimal). For instance, you can easily do hexadecimal or binary math. Use the *ibase* and *obase* commands to set input and output base systems between base-2 and base-16. Remember that once you use *ibase*, any number you enter is expected to be in the new declared base.

To do hexadecimal to decimal conversions or math, you can use a command like this. Note the hexadecimal digits above 9 must be in uppercase (A-F):

echo 'ibase=16; A42F' | bc echo 'ibase=16; 5F72+C39B' | bc

To get results in hexadecimal, set the *obase* as well:

echo 'obase=16; ibase=16; 5F72+C39B' | bc

Here’s a trick, though. If you’re doing these calculations in the shell, how do you switch back to input in base-10? The answer is to use *ibase*, but you must set it to the equivalent of decimal number 10 in the **current** input base. For instance, if *ibase* was set to hexadecimal, enter:

ibase=A

Once you do this, all input numbers are now decimal again, so you can enter *obase=10* to reset the output base system.

## Conclusion

This is only the beginning of what *bc* can do. It also allows you to define functions, variables, and loops for complex calculations and programs. You can save these programs as text files on your system to run whenever you need. You can find numerous resources on the web that offer examples and additional function libraries. Happy calculating!

## Roberto

Why publicize a command line calculator in a time when the computer should read the mind of people and execute the operation ( i’m exceeding, I know ).

There are already, formidable and computational complex online tools that allow to do this, see wolfram.

Or very complex software like matlab even if not free.

What I perceive is that linux doesn’t have innovation to offer than a calculator and this is quite sad

Cit “Is this (is) the end my only friend”

## Sebastiaan Franken

Linux has more to offer than a GUI. Some people use it to work on and some of those people (I am one of those) have automated a great number of tasks, some of which include math. I don’t want my scripts to halfway stop and tell me “Hey, can you open the fancy calculator app you have and do some math for me? I’ll wait.”. No, I want my script to be able to do said math and just carry on and only tell me something when it’s done or when there’s an error. I use bc in a few scripts to calculate averages and do conversions from base-16 to base-10.

That way I can get more work done (in the same amount of time). Linux is all about choice and the freedom to choose the tool that works for you. Like I said, bc is a lifesaver to some of us

## Xose

Shorter:

bc <<< 1+1

## bluebat

A Command-line Calculator in pure BASH

http://www.slideshare.net/bluebat/a-commandlinecalculatorinpurebash

https://gist.github.com/bluebat/9760449

## Hiisi

Great and very useful post. Will apply in my work-flow. Thanks!

## Cătălin George Feștilă

new users can try more if you follow https://docs.fedoraproject.org/en-US/index.html

also the dnf is a great tool like yum the repo is the same …

## dhanvi

This is a very good article about bc 🙂

There is also a -l flag for bc which says to define the math lib, which also gives the answer in the decimal points

echo ‘ 3 / 5 ‘ | bc -l

## Elliot

An easier way to avoid issues with scale is to invoke bc with the -l (–mathlib) option.

## djf

Damn – that’s a great tip – thanks

bc -l <<< 5/450

instead of

bc <<< ‘scale=3;5/450’

## Paul W. Frields

@Elliot: Great tip, thanks!

## Brett

I love bc and use bc every day.

I have bc aliased to “bc -lq”. Sets a reasonable scale and drops the startup banner.

## Saman

Thank you so much. I’ve noticed “scale” doesn’t do the rounding. for example If I want to get the result of 3 / 4 using scale=1, the result is 0.7 instead of 0.8.

## Cătălin George Feștilă

! need time to follow the all docs …

## Brett

One thing I like to do when demonstrating bc is this:

2^4096

🙂

Brett

## Stan

Great info, I wasn’t aware of bc, learning something every day! Many thanks for the posting. I use the cli frequently and now don’t need to switch back to a gui for quick calculations ….. many thanks!

## hyhy123

Really great! I find this useful in some cases, especially when I am writing a shell script and find there are some simple math calculations. The bc can get things done perfectly!

## c4ifford

why not just use python?

## rpndude

Being a rpn person, I usually use ‘dc’; but ‘bc’ is great to, especially in scripts.

## Tad Marko

I’d recommend dc.

## Dale Raby

I never knew about this. I’ve been using an actual slide rule to do quick estimates for an “out the door price” for customers as it takes a few seconds to bring the GUI calculator up. As I always have a shell up, I can open bc and type 299.99+13+1.05(enter) and get $314.04. Yeah, I know I could invest a dollar and get a pocket calculator to replace the one that broke a couple months ago, but I always seem to “lose” those when they are on the counter and yeah, I know I could multiply by 10% and divide by two using my actual organic brain… but this is way cooler!

## Dale Raby

Hmmm… a problem manifests itself. You have to remember to hit the correct keys! 299.99+13*1.05

313.64

## Dale Raby

As I said, the CORRECT keys:

(299.99+13)*1.05

328.63

customers would probably prefer I forget about the brackets…

## Dale Raby

Ooops…

(299.99+13)*1.05

328.63

customers would probably prefer I forget about the brackets…