Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiplication with expr in shell script

I am making a basic calculator to add, subtract, multiply, and divide.

Addition works, but not multiplication. When I attempt to multiply, I get the "You did not run the program correctly" response:

$ ./calculator 4 + 5
9
$ ./calculator 4 * 5
You did not run the program correctly
Example: calculator 4 + 5

I've searched around on google, where I found the \\* code, but still doesn't work. Can someone provide me with a solution or explanation?

Here is my code

#!/bin/bash

if [ $# != 3 ]; then  
  echo You did not run the program correctly   
  echo Example: calculator 4 + 5                
  exit 1 
fi

if [ $2 = "+" ]; then    
  ANSWER=`expr $1 + $3`    
 echo $ANSWER 
fi

if [ $2 = "*" ]; then
  ANSWER=`expr $1 \\* $3`  
  echo $ANSWER 
fi

exit 0
like image 350
Alex Wolfe Avatar asked Nov 30 '14 20:11

Alex Wolfe


People also ask

How do you multiply with expr?

To multiply using expr command use the \* operator.

What does expr do in a shell script?

expr is a command line Unix utility which evaluates an expression and outputs the corresponding value. expr evaluates integer or string expressions, including pattern matching regular expressions.

How do you use multiplication in Linux?

You should use \ on the * symbol for multiplication.


2 Answers

Your code has many problems. Here is a fix. * means "all files in the current directory". To instead mean a literal asterisk/multiplication character, you have to escape it:

./calculator 3 \* 2

or

./calculator 3 "*" 2

You also have to double quote "$2", otherwise * will start meaning "all files" again:

#!/bin/bash
#Calculator
#if [ `id -u` != 0 ]; then
#  echo "Only root may run this program." ; exit 1
#fi
if [ $# != 3 ]; then   
  echo "You did not run the program correctly"
  echo "Example:  calculator 4 + 5"
  exit 1
fi
# Now do the math (note quotes)
if [ "$2" = "+" ]; then echo `expr $1 + $3`
elif [ "$2" = "-" ]; then echo `expr $1 - $3`
elif [ "$2" = "*" ]; then echo `expr $1 \* $3`
elif [ "$2" = "/" ]; then echo `expr $1 / $3`
fi
exit 0
like image 117
hongo Avatar answered Sep 20 '22 22:09

hongo


The * needs to get escaped since it is a special char in shell syntax. (If not escaped, it will get expanded to the list of all files in the current directory). But you need to use just a single backslash in order to escape it:

ANSWER=`expr $1 \* $3` 
like image 28
hek2mgl Avatar answered Sep 24 '22 22:09

hek2mgl