Mnożenie na terminalu wiersza poleceń

115

Używam terminala szeregowego, aby zapewnić dane wejściowe do naszego eksperymentu laboratoryjnego. Znalazłem to za pomocą

$ echo "5X5"

po prostu zwraca ciąg "5X5". Czy istnieje polecenie wykonania operacji mnożenia?

bouncingHippo
źródło

Odpowiedzi:

45

Aby uzyskać bardziej zaawansowaną i precyzyjną matematykę, rozważ użycie bc (1).

echo "3 * 2.19" | bc -l 
6.57
tvm
źródło
19

Metody wewnętrzne

Bash obsługuje ekspansję arytmetyczną z $(( expression )). Na przykład:

$ echo $(( 5 * 5 ))
25

Metody zewnętrzne

Szereg narzędzi zapewnia funkcje arytmetyczne, w tym bc i expr .

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

$ /usr/bin/expr 5 \* 5
25
Todd A. Jacobs
źródło
15

Klasyczne rozwiązanie to:

 expr 5 \* 5

Inną fajną opcją jest:

 echo 5 5\*p | dc

Oba te rozwiązania będą działać tylko z operandami całkowitymi.

William Pursell
źródło
1
dcdziała z pływakami. Spróbuj echo '4 k 50 7 / p' | dc. Wynik jest 7.1428. kPolecenie ustawia precyzję.
Wstrzymano do odwołania.
@Dennis W dwóch różnych implementacjach dc widzę, że operacje float działają bez przypisywania przez k. Z pewnością pamiętam domyślną dokładność równą 0 (obcięcie do liczby całkowitej). Czy źle pamiętam, czy po prostu nowsze implementacje zmieniły zachowanie?
William Pursell
dcPrzez lata używałem rzadko, ponieważ jestem bardziej algebraiczny i mniej RPN, więc nie pamiętam. W systemie GNU, którego używam, wartością domyślną jest 0. Stara (1993) manstrona FreeBSD wspomina, że ​​domyślną wartością jest zero, ale starsze manstrony BSD nie.
Wstrzymano do odwołania.
Nawiasem mówiąc (dla przyszłych czytelników), mój przykład powinien był pokazywać niecałkowite operandy zamiast tylko niecałkowitego wyniku, aby dokładnie przeciwdziałać twierdzeniu. Nie bój się, echo '4 k 50.5 7 / p' | dcdziała (wyjście:) 7.2142.
Wstrzymano do odwołania.
8

Prosta funkcja powłoki (bez seda) powinna załatwić sprawę interpretacji „5X5”

$ function calc { bc -l <<< ${@//[xX]/*}; };
$ calc 5X5
25
$ calc 5x5
25
$ calc '5*5'
25
Moreaki
źródło
6

Używam tej funkcji, która używa bci tym samym obsługuje obliczenia zmiennoprzecinkowe:

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

Przykład:

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

Rozwinięcie arytmetyczne Basha nie obsługuje pływaków (ale powłoka Korna i zsh tak).

Przykład:

$ ksh -c 'echo "$((3.0 / 4))"'
0.75
Wstrzymano do odwołania.
źródło
4

Mam do tego prosty skrypt:

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

#!/bin/sh

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

Zmienia się xna, *ponieważ *jest to znak specjalny w powłoce. Użyj go w następujący sposób:

  • c 5x5
  • c 5-4.2 + 1
  • c '(5 + 5) * 30' (nadal musisz używać cudzysłowów, jeśli wyrażenie zawiera nawiasy).
Wszyscy jesteśmy Monica
źródło
Podoba mi się twój pomysł na użycie „x” do mnożenia. Podobnie możesz użyć nawiasów kwadratowych zamiast nawiasów, aby uniknąć konieczności cytowania. trmoże służyć do mapowania znaków dla wielu znaków.
Wstrzymano do odwołania.
3

Jeśli lubisz Pythona i masz możliwość zainstalowania pakietu, możesz użyć tego narzędzia, które stworzyłem.

# 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
bomby
źródło