Умножение в терминале командной строки

115

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

$ echo "5X5"

просто возвращает строку "5X5". Есть ли команда для выполнения операции умножения?

bouncingHippo
источник

Ответы:

208

Да, вы можете использовать встроенное арифметическое расширение bash$(( )) для выполнения простых математических операций.

$ echo "$((5 * 5))"
25

Проверьте раздел Shell Арифметического в Bash Reference Manual для полного списка операторов.

Для полноты, как указывали другие, если вам нужна произвольная точность, bcили dcбыло бы лучше.

KurzedMetal
источник
45

Для более продвинутой и точной математики рассмотрите возможность использования bc (1).

echo "3 * 2.19" | bc -l 
6.57
TVM
источник
19

Внутренние методы

Bash поддерживает арифметическое расширение с помощью $(( expression )). Например:

$ echo $(( 5 * 5 ))
25

Внешние методы

Ряд утилит предоставляют арифметические операции, включая bc и expr .

$ echo '5 * 5' | /usr/bin/bc
25

$ /usr/bin/expr 5 \* 5
25
Тодд А. Джейкобс
источник
15

Классическое решение:

 expr 5 \* 5

Еще один приятный вариант:

 echo 5 5\*p | dc

Оба эти решения будут работать только с целочисленными операндами.

Уильям Перселл
источник
1
dcработает с поплавками. Попробуй echo '4 k 50 7 / p' | dc. Выход есть 7.1428. Команда kустанавливает точность.
Приостановлено до дальнейшего уведомления.
@Dennis В двух разных реализациях dc я вижу, что операции с плавающей запятой работают без присвоения via k. Я точно помню точность по умолчанию, равную 0 (усечение до целого числа). Я плохо помню, или просто новые реализации изменили поведение?
Уильям Перселл
За эти годы я использовал dcредко, так как я больше разбираюсь в алгебре и меньше RPN, поэтому я не помню. В системе GNU, которую я использую, значение по умолчанию - 0. Старая (1993 г.) FreeBSDman странице упоминается, что значение по умолчанию равно нулю, а на старых manстраницах BSD нет.
Приостановлено до дальнейшего уведомления.
Между прочим (для будущих читателей) мой пример должен был показывать нецелочисленные операнды вместо только нецелочисленного результата, чтобы точно опровергнуть утверждение. Не бойтесь, echo '4 k 50.5 7 / p' | dcработает (вывод:) 7.2142.
Приостановлено до дальнейшего уведомления.
8

Простая функция оболочки (не требуется sed) должна выполнять трюк с интерпретацией '5X5'

$ function calc { bc -l <<< ${@//[xX]/*}; };
$ calc 5X5
25
$ calc 5x5
25
$ calc '5*5'
25
Moreaki
источник
6

Я использую эту функцию, которая использует bcи поддерживает вычисления с плавающей запятой:

c () { 
    local a
    (( $# > 0 )) && a="$@" || read -r -p "calc: " a
    bc -l <<< "$a"
}

Пример:

$ c '5*5'
25
$ c 5/5
1.00000000000000000000
$ c 3.4/7.9
.43037974683544303797

Арифметическое расширение Bash не поддерживает числа с плавающей запятой (но оболочка Korn и zsh поддерживают).

Пример:

$ ksh -c 'echo "$((3.0 / 4))"'
0.75
Приостановлено до дальнейшего уведомления.
источник
4

У меня есть простой скрипт, который я использую для этого:

me@mycomputer:~$ cat /usr/local/bin/c

#!/bin/sh

echo "$*" | sed 's/x/\*/g' | bc -l

Он изменяется xна, *поскольку *это специальный символ в оболочке. Используйте его следующим образом:

  • c 5x5
  • c 5-4.2 + 1
  • c '(5 + 5) * 30' (вам все равно придется использовать кавычки, если выражение содержит скобки).
Мы все Моника
источник
Мне нравится ваша идея использовать «х» для умножения. Вы также можете использовать квадратные скобки вместо скобок, чтобы избежать необходимости цитировать. trможет использоваться для отображения нескольких символов.
Приостановлено до дальнейшего уведомления.
3

Если вам нравится Python и у вас есть возможность установить пакет, вы можете использовать эту созданную мной утилиту .

# install pythonp
python -m pip install pythonp

pythonp "5*5"
25

pythonp "1 / (1+math.exp(0.5))"
0.3775406687981454

# define a custom function and pass it to another higher-order function
pythonp "n=10;functools.reduce(lambda x,y:x*y, range(1,n+1))"     
3628800
бомбы
источник