Умножение с 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