Я могу читать цифры и операции с:
echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op
но тогда все мои попытки добавить цифры провалились:
case "$op" in
"+")
echo num1+num2;;
"-")
echo `num1-num2`;;
esac
Бегать:
First number please
1
Second mumber please
2
Operation?
+
Выход:
num1+num2
...или же...
echo $num1+$num2;;
# results in: 1+2
...или же...
echo `$num1`+`$num2`;;
# results in: ...line 9: 1: command not found
Похоже, что я получаю строки все еще возможно, когда я пытаюсь добавить добавить ("2 + 2" вместо "4").
case
чем, кроме одной строки:,echo $num+$num
поскольку это точно воспроизведет проблему . Идея минимизации контекста в вопросах программирования объясняется здесь: sscce.orgОтветы:
Арифметика в оболочках POSIX выполняется с
$
двойными скобками(( ))
:Вы можете назначить из этого (без
echo
):Также есть
expr
:В сценариях
$(())
предпочтительнее, поскольку он избегает форка / выполнения дляexpr
команды.источник
echo $(($num1$op$num2))
без участияcase
.case
причастности.+
, поэтомуcase
для обработки вычитания потребуется внешняя сторона.case
из кода OP сecho $(($num1$op$num2))
- это будет работать, но использованиеcase
более надежно, поскольку вы можете обрабатывать ошибки по умолчанию*
.Существующий ответ - чистый bash, поэтому он будет быстрее этого, но он может обрабатывать только целые числа. Если вам нужно обрабатывать поплавки, вы должны использовать внешнюю программу
bc
.scale=4
Говоритbc
использовать четыре знака после запятой. Смотритеman bc
для получения дополнительной информации.источник
bash
не поддерживает с плавающей точкой арифметика с$((...))
, много снарядов (ksh93
,zsh
,yash
по крайней мере) делать. Преимуществоbc
заключается в том, что он поддерживает произвольную точность, в то время как арифметика оболочки ограниченаdouble
типом процессора . Обратите внимание, что вам не нужно устанавливатьscale
здесь. Для дополненийscale
параметр не используется. Шкала3.1415+9.99
будет получена из шкалы операндов (здесь 4).450
является десятичным, а другое хранится в переменной$mynumber
? Например,450-$mynumber
.echo "450-$mynumber" | bc
должен это сделать. Если вы хотите, чтобы переменная расширялась, вы должны использовать двойные кавычки, а не одинарные.computedval=$(echo 'scale=10;var1-var2' | bc)
не работает и не работаетcomputedval=$(echo 'scale=10;$var1-$var2' | bc)
Обратите внимание, что
\
перед*
(для умножения) все выражение должно быть в обратных кавычках `.источник
expr
не является обязательным, и никогда не требуется захватывать стандартный вывод команды, просто чтобы записать ее обратно в стандартный вывод.минималист
источник
Вы также можете использовать
$[ ... ]
структуру. В этом случае мы используем встроенный механизм Bash, который быстрее и немного удобнее в использовании. Поскольку мы знаем, что все между $ [и] рассматривается как выражение, нам не нужно ставить переменные перед$
. Точно так же нам не нужно защищать себя*
от того, чтобы рассматривать это как шаблон.источник
Судя по последовательности входных данных, которые вы запрашиваете у пользователя, кажется, что вы используете обратную польскую запись.
Вы можете лучше просто использовать
dc
(настольный калькулятор), так как это то, для чего оно.Пример сеанса с использованием
dc
:Или не в интерактивном режиме:
источник