Multiplikation am Befehlszeilenterminal

115

Ich verwende ein serielles Terminal, um Eingaben in unser Laborexperiment zu liefern. Ich fand das mit

$ echo "5X5"

Gibt nur eine Zeichenfolge von zurück "5X5". Gibt es einen Befehl zum Ausführen einer Multiplikationsoperation?

hüpfen Hippo
quelle

Antworten:

45

Für fortgeschrittenere und präzisere Mathematik sollten Sie bc (1) verwenden.

echo "3 * 2.19" | bc -l 
6.57
tvm
quelle
19

Interne Methoden

Bash unterstützt die arithmetische Erweiterung mit $(( expression )). Beispielsweise:

$ echo $(( 5 * 5 ))
25

Externe Methoden

Eine Reihe von Dienstprogrammen bietet Arithmetik, einschließlich bc und expr .

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

$ /usr/bin/expr 5 \* 5
25
Todd A. Jacobs
quelle
15

Die klassische Lösung lautet:

 expr 5 \* 5

Eine weitere schöne Option ist:

 echo 5 5\*p | dc

Beide Lösungen funktionieren nur mit ganzzahligen Operanden.

William Pursell
quelle
1
dcarbeitet mit schwimmern. Versuchen Sie es echo '4 k 50 7 / p' | dc. Die Ausgabe ist 7.1428. Der kBefehl legt die Genauigkeit fest.
Bis auf weiteres angehalten.
@Dennis In zwei verschiedenen Implementierungen von DC sehe ich, dass Float-Operationen funktionieren, ohne über zuzuweisen k. Ich erinnere mich sicherlich, dass die Standardgenauigkeit 0 war (Kürzung auf Ganzzahl). Erinnere ich mich falsch oder ist es einfach so, dass neuere Implementierungen das Verhalten geändert haben?
William Pursell
Ich habe im dcLaufe der Jahre nur selten verwendet, da ich algebraischer und weniger RPN bin, also erinnere ich mich nicht. Auf einem GNU-System, das ich verwende, ist der Standardwert 0. Eine alte (1993) FreeBSD- manSeite erwähnt, dass der Standardwert Null ist, ältere BSD- manSeiten jedoch nicht.
Bis auf weiteres angehalten.
Übrigens (für zukünftige Leser) hätte mein Beispiel nicht ganzzahlige Operanden anstelle nur eines nicht ganzzahligen Ergebnisses zeigen sollen, um der Behauptung genau entgegenzuwirken. Keine Angst, echo '4 k 50.5 7 / p' | dcfunktioniert (Ausgabe :) 7.2142.
Bis auf weiteres angehalten.
8

Eine einfache Shell-Funktion (keine Sedierung erforderlich) sollte den Trick der Interpretation von '5X5' ausführen.

$ function calc { bc -l <<< ${@//[xX]/*}; };
$ calc 5X5
25
$ calc 5x5
25
$ calc '5*5'
25
Moreaki
quelle
6

Ich benutze diese Funktion, die bcGleitkommaberechnungen verwendet und somit unterstützt:

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

Beispiel:

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

Bashs arithmetische Erweiterung unterstützt keine Floats (Korn Shell und Zsh jedoch).

Beispiel:

$ ksh -c 'echo "$((3.0 / 4))"'
0.75
Bis auf weiteres angehalten.
quelle
4

Ich habe ein einfaches Skript, das ich dafür benutze:

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

#!/bin/sh

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

Es ändert sich xzu, *da *es sich um ein Sonderzeichen in der Shell handelt. Verwenden Sie es wie folgt:

  • c 5x5
  • c 5-4.2 + 1
  • c '(5 + 5) * 30' (Sie müssen immer noch Anführungszeichen verwenden, wenn der Ausdruck Klammern enthält.)
Wir sind alle Monica
quelle
Ich mag Ihre Idee, ein "x" für die Multiplikation zu verwenden. Sie können auch eckige Klammern anstelle von Klammern verwenden, um Anführungszeichen zu vermeiden. trkann verwendet werden, um eine Zeichenzuordnung für mehrere Zeichen durchzuführen.
Bis auf weiteres angehalten.
3

Wenn Sie Python mögen und die Option haben, ein Paket zu installieren, können Sie dieses von mir erstellte Dienstprogramm verwenden .

# 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
Bomben
quelle