Умножение с expr в сценарии оболочки

Я делаю основной калькулятор для сложения, вычитания, умножения и деления.

Сложение работает, но не умножение. Когда я пытаюсь умножить, я получаю ответ "Вы неправильно запустили программу":

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

Я искал вокруг в Google, где я нашел \\* код, но все еще не работает. Может ли кто-нибудь предоставить мне решение или объяснение?

Вот мой код

#!/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

3 ответа

У вашего кода много проблем. Вот исправление. * означает "все файлы в текущем каталоге". Чтобы вместо этого означать буквальный символ звездочки / умножения, вы должны избежать его:

./calculator 3 \* 2

или же

./calculator 3 "*" 2

Вы также должны двойные кавычки "$2", иначе * снова начнет означать "все файлы":

#!/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

* должен быть экранирован, поскольку это специальный символ в синтаксисе оболочки. (Если не экранировать, он будет расширен до списка всех файлов в текущем каталоге). Но вам нужно использовать только одну обратную косую черту, чтобы избежать этого:

ANSWER=`expr $1 \* $3` 

Для двух элементов:

      #!/bin/bash
echo "Enter two numbers:"
read a
read b
mult=`expr $a \* $b`
echo "Multipication:" $mult

Для массива:

      #!/bin/bash
echo "Enter total numbers:"
read n
mult=1
echo "Enter Numbers:"
for (( i = 0; i < n; i++ ))
do
read a[i]
mult=`expr $mult \* ${a[$i]}`
done
echo "Original numbers:" ${a[@]}
echo "Multipication:" $mult
Другие вопросы по тегам