Can you solve the below math expression on your own without using any device? Take as much time as you need – but no tools allowed:
( ( 11 + 97 ) + ( 2 * 63 ) - ( 7 / 93 ) * ( 8 - 25 ) / ( 9 * 64 ) ) * ( ( 64 / 34 ) + ( 94 - 20 ) - ( 23 + 98 ) * ( 199 * 928 ) / ( 92 * 26 ) ) * ( ( ( 2 * 1 ) / 2 ) - 1 )
Kudos to you if you solved it on your own. I'm sure you'll be angry with me, though, after discovering that the result of this long expression just evaluated to zero.
So what if you used your browser to find the answer? How long would that take?
Searching this expression on Google took less than a second to get the answer (using a 500MBPS connection) along with 5,21,00,000 results.
Search results by Google for the given expression
Yahoo gave us the answer in less than 500 ms along with 1,480,000,000 search results.
Search results by Yahoo for the given expression
Bing didn't even return anything.
But my terminal and system calculator were almost instant in finding the answer (took < 10 ms).
Using the terminal is one of the quickest ways to evaluate a mathematical expression. But many developers are unaware that you can solve mathematical expressions using your terminal.
In this article, you'll learn how to solve math problems in the Linux terminal.
How to Evaluate a Mathematical Expression in the Linux Terminal
You can use the expr
command to evaluate mathematical expression in your terminal. Basic mathematical operations such as addition, subtraction, multiplication, division and modulus all work using the expr
command.
Let's have a quick look at each of these operations:
expr 12 + 8 # Addition
expr 20 - 10 # Subtraction
expr 5 \* 2 # Multiplication
expr 8 \/ 4 # Division
expr 5 \% 3 # Modulus
Using the expr
terminal command to find answers to arithmetic operations
Running each of those commands in the terminal evaluates and returns the answer of that expression (as you can verify in the attached screenshot).
You might be thinking, "Why is there a backward slash () for the last 3 operations (Multiplication, Division, and Modulus)?"
A backward slash in programming is basically used to escape characters. Let's take the example of the Multiplication symbol (). "" is used in regular expressions which basically means to include all files and folders.
Here's a quick example:
cp ./* ../backup/
Running the above command will copy all the files and folders in the current directory to the backup directory.
Similarly, each symbol has their own meaning. Using a backward slash () will escape its regular usage pattern. This is the reason that most symbols are prefixed with a backward slash.
But, you may wonder, is this all this command can do?
The answer is no. I've shared a sample of the expressions, but we could use any others and get the results in a fraction of a second.
How to Evaluate a Logical Expression in the Terminal
In addition to finding the results of a mathematical expression, you can use this command to evaluate a logical expression.
Logical expressions containing <, <=, >, >=, =, != can be evaluated with this command.
Let's have a quick look at how it works:
expr 2 \< 1
expr 29320 \> 23820
expr 29320 \>= 29320
expr 29320 \< 29320
expr 29320 \<= 29320
expr 293202 \= 293203
expr 293202 \!= 293203
Evaluate logical expressions with expr
command
The command returns "1" if the expression evaluates to true and "0" if it evaluates to false.
From the above commands you can notice that all the logical operators are escaped with a backward slash ().
What Do the Special Logical Operators Do?
I read your mind. You're thinking, "I know about logical operators. What are the special logical operators?".
Well, the special logical operators are:
- AND (&)
- OR (|)
From a programming perspective, the AND operator evaluates to true if both sides of the operator evaluates to true. The OR operator evaluates to true if either of the sides evaluates to true.
Here's the table for your reference. Some people may be familiar with 1
and 0
. For those people, replace FALSE with 0
and TRUE with 1
.
X | Y | X OR Y | X AND Y |
FALSE | FALSE | FALSE | FALSE |
FALSE | TRUE | TRUE | FALSE |
TRUE | FALSE | TRUE | FALSE |
TRUE | TRUE | TRUE | TRUE |
But they have a completely different usage with the expr
command. Let's have a quick look at it.
The expr
command works similar to the above table. But there's an exception for a particular case. This command will never return 1
if an expression evaluates to true – instead it returns an argument.
Evaluating expr ARG1 | ARG2
returns ARG1 if ARG1 is neither null
nor 0
, otherwise it'll return ARG2. On the other hand, evaluating expr ARG1 & ARG2
returns ARG1 if neither of the arguments are null
or 0
. It returns 0
otherwise.
Let's examine few examples with the logical OR operator:
expr 1 \| 2 # Returns first argument (1)
expr 0 \| 2 # Returns second argument (2) as first argument is 0
expr "" \| 2 # Returns second argument (2) as first argument is null
(Empty string [""] is considered as null in terminal)
expr 100 \| 78 # Returns first argument 100
expr "" \| "" # Returns 0 as both arguments are null ("")
Evaluating logical OR expressions with expr
command
The above screenshot represents operations with logical OR operator (|). Reading that you may still have a couple of questions:
What's the purpose of using empty double quotes ("") in the expression?
Empty double quotes represent a null
value in bash. So, as said earlier, if the first argument is null, the second argument is returned.
What if both the arguments are null?
When evaluating both arguments with null values, both the Logical OR and AND operators return 0
.
Let's examine a few examples with the logical AND operator:
expr 1 \& 2 # Returns first argument (1)
expr 1 \& 0 # Returns 0 as one (second) argument is 0
expr 0 \& 1 # Returns 0 as one (first) argument is 0
expr "" \& 1 # Returns 0 as one (first) argument is null ("")
expr 1 \& "" # Returns 0 as one (second) argument is null ("")
expr "" \| "" # Returns 0 as both arguments are null ("")
Evaluating logical AND expressions with expr
command
How to Perform String Operations with the expr
Command
The expr
command is not limited to mathematical and logical operations. It can perform string operations, too.
Pattern Matching with Regex
The expr
command can verify if a text matches with a regex pattern. It returns the matched pattern of the text if it exists or else returns an empty line.
The syntax to verify the regex is:
expr STRING : REGEXP
or
expr match STRING REGEXP
expr
command evaluates regex pattern match with the given text
You can achieve this either by using the match
keyword or by using a semicolon (:
) between the string and the regex pattern.
Alternatively, you can use the semicolon to find the number of characters matching between the two texts.
Here's an example:
expr Remember : Remo # Returns 0
expr Remember : Rem # Returns 3
expr
command to find the number of characters matching the given text
Find the length of a text
You can use the expr length
command to find the length of the given text.
expr length Linux
expr length "Learning Linux is fun"
expr length
command showing the number of characters in the given text
You can enter the text directly after the expr length
command if it does not have any spaces. If the text has spaces, enclose them within double quotes (""), or else you'll get an error.
Find a character in a text
You can find a particular character from a given text using the expr index
command. It returns the place where the character exists.
expr index STRING CHAR
expr index
to find a character from a text
Remember that the expr index
command performs a case-sensitive search and returns the first matching index of a character from the text.
Extract a substring from a string
Extracting a substring from a string is simple using expr
command. Entering the string, start index, and number of characters to be clipped after the start index will return the expected substring.
expr substr Carpenter 4 3 # Returns pen
expr substr
command to find a substring from a string
Conclusion
In this article, you have learnt the use cases of the expr
command.
If you enjoyed my tutorial, you can subscribe to my newsletter on my personal site to receive more such insightful articles straight to your inbox. You'll also find a consolidated list of all my blog posts.