Linux systems provide numerous ways to work with numbers on the command line – from doing calculations to using commands that generate a range of numbers. This post details some of the more helpful commands and how they work.

### The expr command

One of the most commonly used commands for doing calculations on Linux is **expr**. This command lets you use your terminal window as a calculator and to write scripts that include calculations of various types. Here are some examples:

$ expr 10 + 11 + 12 33 $ expr 99 - 102 -3 $ expr 7 * 21 147

Notice that the multiplication symbol ***** in the command above requires a backslash to ensure the symbol isn’t interpreted as a wildcard. Here are some more examples:

$ expr 147 / 7 21 $ expr 81 % 10 1

The two calculations above do a division and provide a modulus (the number that remains after 81 is divided by 10).

### Using double parentheses

You can also do a lot of calculations using double parentheses. Here’s an example:

$ sum=$(( 1 + 10 )) $ echo $sum 11

Other calculations using double parentheses (multiplication, subtraction, division and modulus) are shown below.

$ num=$(( 3 * 17 )) $ echo $num 51 $ num=$(( 124 - 37 )) $ echo $num 87 $ num=$(( 124 / 37 )) $ echo $num 3 $ num=$(( 124 % 37 )) $ echo $num 13

You can also combine parentheses and **expr** commands like this:

$ num=5 $ num=$(expr $num + 11) $ echo $num 16

Alternately, you can use backticks like this:

$ num=5 $ num=`expr $num + 11` $ echo $num 16

### Using bc

The **bc** command provides a precision calculator that allows you to do calculations and even specify how many decimal places you want to see when the results are not whole numbers.

$ echo "26/3" | bc 8 $ echo "scale=3;26/3" | bc 8.666

You can also calculate factorials with commands like the one shown below. Just in case you haven’t thought about factorials in many years, they involve multiplying all whole numbers from the chosen number down to one. For example, 3! (factorial 3) would be 6 (3 x 2 x 1). The command below calculates the value of 10! by using the **seq** command to generate the list of numbers (10 9 8 etc.) and then passing them to **bc** to do the multiplication.

$ seq -s "*" 1 10 | bc 3628800 $ expr 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 3628800

I included the **expr** command to verify that the **seq** output sent to the **bc** command is generating the correct output.

### Using awk

Even **awk** can help with math. Here are two examples of commands you can try on the command line:

$ awk 'BEGIN { a = 76; b = 42; print "(a + b) =", (a + b) }' (a + b) = 118

$ echo 66 77 90 | awk '{ sum = $1 + $2 + $3 ; avg = sum /3; print avg }' 77.6667

### Using the factor command

The ** factor** command is used to print the prime factors of given numbers. Here’s an example in which the number 111 is factored:

$ factor 111 111: 3 37

As you can see, the two factors for 111 are 3 and 37. You can verify this if you’re so inclined by multiplying those numbers and seeing that the result is indeed 111.

$ expr 3 * 37 111

If you make the starting number one larger, you will see a much longer list of factors:

$ factor 112 112: 2 2 2 2 7

Clearly the multipliers required to get to 112 are much more significant. Remember that all of the factors need to be prime numbers or we would be seeing just 16 and 17.

$ expr 2 * 2 * 2 * 2 * 7 112

### Numeric operators

The table below displays the numeric operators that you can use with most numeric commands. Just remember to use a backslash before an *****.

operator | operation |
---|---|

+ | addition |

– | subtraction |

/ | division |

* | multiplication |

% | modulus |

### Numeric comparisons

You can also compare numbers with operations that test whether numeric variables are equal, unequal, greater or smaller than some other variables. Here’s one example:

$ num=11 $ if [ $num == 11 ]; then echo eleven; else echo oops; fi

eleven

To test whether numbers are equal to, greater or equal to or equal to come value, use a command like one of these:

$ if [ $num -ge 11 ]; then echo ok; else echo oops; fi ok $ if [ $num -gt 11 ]; then echo wow; else echo ok; fi ok $ if [ $num -lt 9 ]; then echo wow; else echo ok; fi ok $ if [ $num != 11 ]; then echo wow; else echo ok; fi ok

The table below lists the numeric comparisons.

operator | test |
---|---|

== | equal |

-ge | greater or equal |

-gt | greater than |

-lt | less than |

!= | not equal |

### Generating number lists

You can generate lists of numbers using the **jot** or **seq** commands (depending on which version of Linux you are using).

$ jot 5 1 2 3 4 5

$ seq 1 5 1 2 3 4 5

In fact, there’s no requirement that you start with 1.

$ seq 27 33 27 28 29 30 31 32 33

You also don’t have to list every number in the specified range. The **seq** command below starts with 10, increments each number by 4 and then stops when it reaches the last increment in the range (24 in this case).

$ seq 10 4 24 10 14 18 22

### Wrap-up

Doing math on the command line can be fun and often quite helpful when you need to calculate values. If you’d like to see a post I wrote five or so years ago on doing math on the command, check this one out:

Copyright © 2023 IDG Communications, Inc.