Einfacher Befehlszeilenrechner


19

Problem:

Hin und wieder muss ich einfache Arithmetik in einer Befehlszeilenumgebung ausführen. ZB bei folgender Ausgabe:

Disk /dev/sdb: 256GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name  Flags
 1      1049kB  106MB   105MB   fat32                 hidden, diag
 2      106MB   64.1GB  64.0GB  ext4
 3      64.1GB  192GB   128GB   ext4
 5      236GB   256GB   20.0GB  linux-swap(v1)

Wie kann auf einfache Weise die Größe des nicht zugewiesenen Speicherplatzes zwischen Partition 3 und 5 in der Befehlszeile berechnet werden ?

Was ich schon ausprobiert habe:

bc

bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
236-192
44
quit

wo die fett oben ist alles das , was ich brauche zu geben Sie eine einfach zu tun 236-192als bc 1+1EchoFile 1+1 is unavailable.

ausdr

expr 236 - 192

Wo muss ich Leerzeichen vor und nach dem Operator als expr 1+1nur Echos eingeben 1+1.


3
Wenn Sie beabsichtigen , diese interaktiv zu machen, brauchen Sie nicht zu geben quitin bc; Drücken von ctrl-Dgenügt wie in jedem interaktiven Programm.
März

2
dcist (IMO) weit überlegen bc.
William Pursell

1
Ich denke, der nicht zugewiesene Raum zwischen Punkt 3 und 5 sollte 236 - 192 sein, und nicht 236 - 128?
Digitales Trauma

@DigitalTrauma gutes Auge! (Es war nur ein Beispiel und niemand hat es gesehen!)
Fabby

1
@JanM. Ich bin derjenige, der aufgestimmt hat .... ;-)
Fabby

Antworten:


33

Sie können den Umfang der Ausführlichkeit erheblich reduzieren, wenn Sie Folgendes verwenden bc:

$ bc <<<"236-192"
44
$ bc <<<"1+1"
2

(Vorausgesetzt, Ihre Shell unterstützt das).

Wenn Sie das lieber als Funktion haben möchten:

$ c() { printf "%s\n" "$*" | bc }
$ c 1+1
2

Speichern Sie die cDefinition in Ihrer bevorzugten Shell-Startdatei, wenn Sie sie immer verfügbar machen möchten.


2
bc<RET>236-128<RET>quit<RET>beträgt 16 Tastenanschläge. bc<<<"236-128"<RET>beträgt 15 Tastenanschläge. Nicht das, was ich "stark reduzierter Tippaufwand" nennen würde :-) bcKann aber auch mit beendet werden ^D, so dass die erste Option auf 13 Tastenanschläge reduziert wird ( ^Dals zwei zählen).
L. Levrel

Richtig, es geht mehr um Ausführlichkeit ;-).
Stephen Kitt

2
@ L.Levrel Mit der Funktion ist es genau c 1+1das, was ich brauchte! :-) (Antwort aktualisiert, um dies
klarzustellen

Und wenn Sie Fließkommazahlen verwenden: c 'scale = 2; 17/3 '(oder besser, skalieren Sie eine Variable, die in der Funktion' c () 'verwendet wird, und definieren Sie ihren Wert, wenn Sie n Dezimalstellen benötigen. Die Standardeinstellung ist 0.)
Olivier Dulac

1
Verwenden Sie sie lieber bc -lin der Funktionsdefinition, um sie leistungsfähiger zu machen.
Isaac

22

Schale

Die einfachste Berechnung in der CLI ist die CLI (Shell) selbst (wenn dies IFSdie Standardeinstellung ist):

$ echo $(( 22 + 333 ))
355

Leerzeichen können weggelassen werden:

$ echo $((22*333))
7326

Da es Teil von POSIX ist , haben es fast alle Shells. Und es enthält die meisten mathematischen Funktionen in C (außer dass zsh eine andere Priorität hat, setzen Sie C_PRECEDENCES, um einen kompatiblen Wert wiederherzustellen):

$ echo $((22*333^2))
7324

Und einige Shells haben den größten Teil der mathematischen Syntax in C (einschließlich Komma):

$ echo $((a=22,b=333,c=a*b,c))
7326

In einigen Shells handelt es sich jedoch nur um ganzzahlige Mathematik (und normalerweise weniger als 2 63 in heutigen Betriebssystemen):

$ echo $((1234/3))
411

$ zsh -c 'echo $((2**63))'
-9223372036854775808

Einige Muscheln könnten schwimmend rechnen:

$ ksh -c 'echo $((1234/3.0))'
411.333333333333333

$ ksh -c 'echo $((12345678901234567890123/3.0))'
4.11522630041152263e+21

Vermeiden Sie zsh (zcalc hat ähnliche Probleme):

$ zsh -c 'echo $((12345678901234567890123 + 1))'
zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1
-1363962815083169259

Ich empfehle Ihnen zu vermeiden expr, es braucht manchmal seltsame Fluchten:

$ expr 22 \* 333
7326

bc

Auf der nächsten Ebene ist ( auch POSIX ) bc(Cousin von RPN dc)

$ echo '22*333' | bc
7326

$ echo '22 333 * p' | dc
7326

Das dc war POSIX, wurde aber 2017 entfernt .

Kürzere, wenn Ihre Shell es unterstützt:

$ bc <<<'22*333'
7326

Oder auch:

$ <<<'22*333' bc
7326

Beide sind beliebige Präzisionsrechner mit einigen internen mathematischen Funktionen:

$ bc <<<2^200
1606938044258990275541962092341162602522202993782792835301376

$ echo 's(3.1415/2)' | bc -l        # sine function
.99999999892691403749

awk

Nach diesen wirklich grundlegenden Calc-Tools müssen Sie zu anderen Sprachen wechseln

$ awk "BEGIN {print (22*33)/7}"
103.714

$ perl -E "say 22*33/7"
103.714285714286

$ python3 -c "print(22*33/7)"
103.71428571428571

$ php -r 'echo 22*33/7,"\n";'
103.71428571429

Funktion

Sie können eine Funktion für eine der oben genannten Optionen definieren:

c () 
{ 
    local in="$(echo " $*" | sed -e 's/\[/(/g' -e 's/\]/)/g')";
    gawk -M -v PREC=201 -M 'BEGIN {printf("%.60g\n",'"${in-0}"')}' < /dev/null
}

Und benutze:

$ c 22* 33 /7                   # spaces or not, it doesn't matter.
103.714285714285714285714285714285714285714285714285714285714

20

Wenn ich die Kommentare auf dieser Seite lese , sehe ich ein UNIX / Linux-Programm calc, das genau das tut, was Sie wollen. Wenn unter Debian / Ubuntu / Derivaten:

sudo apt-get install apcalc

dann kannst du:

calc 236-192

und wenn Sie einen Alias alias c='calc'zu Ihrem hinzufügen .bashrcoder /etc/bash.bashrcdann wird es einfach:

c 1+1

in der Befehlszeile.


1
Nicht perfekt, aber gut genug für eine Gegenstimme. Missverständnisse im Chat behoben und Abstimmungen von anderen Nutzern entfernt . Löschte meine eigene (minderwertige) Antwort ... ;-)
Fabby


9

Das unitsProgramm ist zwar nicht als Taschenrechner gedacht, funktioniert aber ziemlich gut.

$ units "236-192"
    Definition: 44
$ 

Wenn der Ausdruck Leerzeichen enthält, muss er durch Anführungszeichen geschützt sein.
Es unterstützt Exponentiale und tiefes Verschachteln von Klammern


3
Er ist vielseitig: units -t -d 10 "236GB - 192GB" GBAusgänge 44, units -t -d 15 "236GB - 192GB" bytesAusgänge 44000000000, usw.
agc

6

Wie in einem Kommentar zu einer früheren Antwort angemerkt, ermöglicht die Standard-Shell (ba) sh, arithmetische Ausdrücke darin auszuwerten $((...)). Ich konnte nicht überprüfen, ob dies Teil des POSIX-Standards ist, aber ich habe überprüft, ob es auch auf Cygwin und der Mingw32-Shell funktioniert.

Um zu sehen das Ergebnis, dann würden Sie in der Tat geben müssen echo $((...)), was einige Zeichen mehr als (interaktive Nutzung) macht bc. Um jedoch zu verwenden das Ergebnis in einem Skript, wird dies wahrscheinlich kürzer sein als die bcLösung (die sein könnte, zum Beispiel `echo ...|bc`).

In Bezug auf die Ausführlichkeit bcerlaubt der Befehl die Option, -qdie die Ausgabe des "normalen GNU- bcWillkommens" unterdrückt .

Als letzte, leicht umrandete Bemerkung sei angemerkt, dass bces sich nicht nur um einen Taschenrechner, sondern um eine vollwertige Programmiersprache handelt (einschließlich benutzerdefinierter Funktionen, while & for-Schleifen usw. usw.). Eine weitere Tatsache, die nahe legt, die eingebauten Rechenfunktionen für solch einfache Berechnungen anstelle eines externen Programms zu bevorzugen. Das heißt, das Extrahieren der Daten für gegebene Partitionsnummern und das Behandeln von "M" - und "G" -Suffixen, wie es die ursprüngliche Frage zu sein schien, könnte (g)awkeher erfordern als bc.

Quellen: https://www.gnu.org/software/bc/manual/html_mono/bc.html https://www.gnu.org/software/gawk/manual/html_node/Getting-Started.html


Vielen Dank! Hervorragende erste Antwort! +1
Fabby

2
$((...))heißt Arithmetic Expansion und ist Teil von POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/… Für mich ist der größte Nachteil dieser Funktion einer POSIX-Shell, dass sie nur Ganzzahlarithmetik unterstützt :(
pabouk

6

Was ich in zsh mache ist:

$ <<< $(( 236 - 192 ))
44

In bash muss ich cat explizit erwähnen:

$ cat <<< $(( 236 - 192 ))
44

Wenn das Ergebnis Nachkommastellen enthalten soll (funktioniert in zsh, nicht in bash), würde ich einem der Operanden einen Radixpunkt hinzufügen

$ <<< $(( 236 / 128 )) 
1
$ <<< $(( 236. / 128 ))
1.84375

7
echo $((236 - 128))funktioniert auch ;-).
Stephen Kitt

Vermeiden Sie zsh: zsh -c 'print $((12345678901234567890123 + 1))' zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1 -1363962815083169259.
Isaac

@Isaac sagt zumindest zsh, dass es abgeschnitten wird; Bash gibt Ihnen nur eine falsche Antwort, ohne sich zu beschweren.
Stephen Kitt

@StephenKitt Das Problem mit zsh ist komplexer als eine Ausgabe zeigt. Vergleichen Sie: zsh -c 'print $((12345678901234567890123 + 1))'und zsh -c 'print $((123456789012345678901 + 1))'. Es wird bei verschiedenen Längen abgeschnitten und erzeugt unterschiedliche numerische Ergebnisse.
Isaac

@StephenKitt Stattdessen folgt Bash dem Handbuch (und der C-Sprache zum Überlauf eines signierten Int). Nicht, dass es mir persönlich gefällt, aber es ist so dokumentiert. Versuchen Sie bash -c 'echo $((1<<63))'und `` bash -c 'echo $ (((1 << 63) -1))' `.
Isaac

6

Persönlich mag ich libqalculate (die Kommandozeilenversion von Qalculate ).

$ qalc
> 236-192

  236 - 192 = 44

Während die Oberfläche sicherlich einfach ist, ist (lib) qalculate ein leistungsfähiger, vollwertiger Taschenrechner. z.B

> fibonacci(133) to hex

  fibonacci(133) = approx. 0x90540BE2616C26F81F876B9

> 100!

  factorial(100) = approx. 9.3326215E157

> sin(pi)

  sin(pi * radian) = 0

Außerdem werden nützliche Funktionen wie das Ausfüllen von Registerkarten, das Öffnen / Schließen von Klammern bei Bedarf und das Drucken der Interpretation der Abfrage ausgeführt.

> 18-2)/4

  (18 - 2) / 4 = 4

Zum Beenden drücke ich einfach Ctrl+ d.

Stellen Sie für einen noch schnelleren Zugriff die Option auf alias ca='qalc'.


Ich habe das Inhaltsverzeichnis des Handbuchs gelesen, konnte aber nichts über CLI finden. (+1 in der Zwischenzeit)
Fabby

1
Vielen Dank @ Fabby. Ich war verwirrt und der CLI-Teil ist tatsächlich etwas anders. Ich habe die Antwort zur Klarstellung aktualisiert.
Sparhawk

Ich wünschte, ich könnte dich zweimal stimmen! ;-)
Fabby

4

Python in einem anderen Tab öffnen?

Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 17:26:49) [MSC v.1900 32 bit (Intel)] on 
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 3+3
6
>>>

Nein, nicht wirklich, aber trotzdem eine gute Idee! :-) +1
Fabby

Powershell kann auch das Gleiche tun
phuclv

1
@phuclv ja, aber niemand mag PS
Dev

3
@ Dev Tonnen von Unix Menschen lieben PS
Phuclv

2

dc -e '236 192-p'

... Wenn Sie nicht mit dczwei Zahlen vertraut sind und mehr benötigen, als sie zu subtrahieren, verbringen Sie mehr Zeit damit, nachzuschlagen, wie Sie sie verwenden dc(und möglicherweise RPN im Allgemeinen), als mit bekannteren Methoden zu sparen.


Ja, ich habe mir Desk Calculator 3 Minuten lang angesehen und wusste, dass es nichts für mich ist: Ich war ein TI, kein HP-Student.
Fabby

2

Wenn du gradle installiert hast dann hast du groovige ...

Wenn Groovy korrekt dargestellt wird, sollten Sie Folgendes verwenden können:

groovy -e "println 1+1"

Dies mag bei allen anderen Beispielen etwas überflüssig erscheinen, aber:

  • groovy ist eine mächtige sprache
  • Möglicherweise die beste verfügbare Bibliotheksunterstützung
  • leistungsstarke und einfache mathematische Funktionen (wie beliebige Präzisionsmathematik)
  • verwendet redirectable stdout für die Ausgabe, so dass es erstaunlich flexibel ist (ideal für die Verwendung in Batch-Dateien mit Backticks `` und dergleichen).

Wenn Sie kein Java installiert haben, lohnt es sich wahrscheinlich nicht, groovy & java zu installieren - es ist nur eine Option, wenn groovy bereits verfügbar ist.


Nein, nicht wirklich, aber trotzdem eine gute Idee! :-) +1
Fabby

2

Haben Sie versucht, concalc ?

Beschreibung: Konsolenrechner concalc ist ein Rechner für die Linux-Konsole. Es ist nur der Parser-Algorithmus von extcalc, der in ein einfaches Konsolenprogramm gepackt ist. Sie können es verwenden, wenn Sie einen Taschenrechner in Ihrer Shell benötigen. concalc kann auch Skripte ausführen, die in einer C-ähnlichen Programmiersprache geschrieben sind.

$ concalc 1+1
2
$ concalc sqrt2
1.41421356237309505

Installieren mit:

sudo apt-get install concalc

1
Beweis ... Graag gedaan ... :-D
Fabby

2

Bevor eine der anderen brillanten Antworten veröffentlicht wurde, habe ich das Skript erstellt /usr/local/bin/c enthält:

#!/bin/sh
IFS=' '               # to be on the safe side, some shells fail to reset IFS.
if [ "$#" -eq 0 ];  then
    echo "$(basename "$0"): a (very) simple calculator."
    echo "type $(basename "$0") expression to evaluate (uses bc internally)"
fi

printf '%s\n' "$*" | bc -l  # safe for most shells
                            # we may use 'bc -l <<<"$*"` for ksh, bash, zsh

Also: Tippen c 1+1 Ertrag2 ! :-)

Hinweis 1: Ich habe cdiesen Befehl verwendet, da er auf keinem Unix-System vorhanden ist, das ich finden konnte. Wenn Sie dies auf Ihren c-Compiler verlagert hätten, verwenden Sie alles andere, was kurz ist und Sie nicht verwenden.
Anmerkung 2: Quelle


1
(1) Beschlossen, echo "$*" | bc -lals den von Ihnen verwendeten Shebang zu verwenden, /bin/shund ich weiß nicht, ob Sie ksh / bash / zsh zur Verfügung haben. (2) Beachten Sie, dass Sie die zu berechnende Skala ändern können, wenn Sie beispielsweise "c" scale = 60; 777/333 "ausführen. Hoffe, es hilft @ Fabby
Isaac

1

Wenn Python installiert ist, können Sie viele mathematische Operationen über die Befehlszeile ausführen. Ich habe versucht, unten ein Beispiel anzugeben.

Ich habe verwendet, dass python3Sie verwenden können python. Der Unterschied zwischen pythonund python3tritt auf, wenn geteilte (gebrochene) Operationen auftreten, um das Problem zu vermeiden, siehe unten python vs python3 .

Hinweis: Alle Linux-Versionen werden standardmäßig mit Python 2.7 und Python 3.5 geliefert. Für den Fall, dass Sie Python installieren müssen klicken Sie hier .

Addieren, Subtrahieren, Multiplizieren und Teilen:

$ python3 <<< "print(12+3)"
15
$ python3 <<< "print(12-3)"
9
$ python3 <<< "print(12*3)"
36
$ python3 <<< "print(12/3)"
4

Modul-Rest der Abteilung:

$ python3 <<< "print(14%3)"
2

Etageneinteilung:

$ python3 <<< "print(14//3)"
4

Exponent - x hoch y (x ^ y):

$ python3 <<< "print(3**2)"
9

Quadratwurzel (Beispiel: √4 = 2):

$ python3 <<< "print(4**0.5)"
2

Für einen wissenschaftlicheren Teil benötigen Sie eine importierte mathematische Bibliothek. Ex:

Der natürliche Logarithmus von x = log (x):

$ python3 <<< "import math; print(math.log(4))"
1.386294361119890e6

Der Logarithmus zur Basis 10 von x = log10 (x):

$ python3 <<< "import math; print(math.log10(10))"
1.0

Fakultät (Beispiel: 3! = 3.2.1 = 6):

$ python3 <<< "import math; print(math.factorial(3))"
6

Trigonometry- sin(x), cos(x), tan(x):

$ python3 <<< "import math; print(math.sin(90))"
0.8939966636005579

Weitere mathematische Funktionen finden Sie hier .

pythonVs python3:

-Zum Teilen: (benutze float):

$ python <<< "print(10.0/3)"
3.33333333333

-anstatt

$ python <<< "print(10/3)"
3

Sie können auch direktes Terminal verwenden:

$ python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+3
4
>>> import math
>>> math.log10(4)
0.6020599913279624
>>> math.sqrt(4)
2.0
>>> 

Das ist es. Viel Spaß beim Codieren!


0

Entweder bcoder qalc.


Um automatisch bcimmer auf zwei Ziffern zu runden: (läuft mit-l ist für alltägliche Dinge unhandlich.)

Bearbeiten Sie Ihre ~/.bashrc:

alias bc="BC_ENV_ARGS=<(echo "scale=2") \bc"

Öffne eine neue Shell und starte sie bc.


-1

Erstellen eines Einzeilers:

$ c () { echo $(( ${1} )) }

Jetzt können Sie einfache Ganzzahl-Mathematik verwenden:

$ c 1+1
2

$ c 25*4
100

$ c 25*4-10
90

$ c 20*5/4
25

Dies wird bereits in Isaacs Antwort besprochen .
Stephen Kitt

@StephenKitt Ja, ich habe Isaacs sehr detaillierte Antwort positiv bewertet. Ich dachte, ein Einzeiler, der einige seiner Beiträge zusammenfasst, wäre hilfreich. Die ${1}Verwendung der Parameter ist für alle Antworten eindeutig.
WinEunuuchs2Unix

2
Ich ermutige Sie, die Gründe zu untersuchen, die andere Antworten nicht verwenden ${1};-)
Stephen Kitt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.