Prosty kalkulator wiersza poleceń


19

Kwestia:

Co jakiś czas muszę wykonywać prostą arytmetykę w środowisku wiersza poleceń. EG, mając następującą moc wyjściową:

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)

Jak w prosty sposób obliczyć w wierszu poleceń wielkość nieprzydzielonego miejsca między partycją 3 a 5?

Co już próbowałem:

pne

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

gdzie pogrubienie powyżej to wszystko, co muszę wpisać, aby zrobić proste 236-192jak bc 1+1echoFile 1+1 is unavailable.

expr

expr 236 - 192

gdzie muszę wpisywać spacje przed i za operatorem, jak expr 1+1tylko echo 1+1.


3
Jeśli masz zamiar to zrobić interaktywnie, nie trzeba wpisywać quitsię bc; naciśnięcie ctrl-Dzrobi, jak w każdym programie interaktywnym.
marcelm

2
dcjest (IMO) znacznie lepszy od bc.
William Pursell

1
Myślę, że nieprzydzielona przestrzeń między 3 a 5 pkt 3 powinna wynosić 236 - 192, a nie 236 - 128?
Digital Trauma

@DigitalTrauma dobre oko! (To był tylko przykład i nikt tego nie zauważył!)
Fabby

1
@JanM. Jestem tym, który głosował .... ;-)
Fabby

Odpowiedzi:


33

Możesz znacznie zmniejszyć ilość gadatliwości związanej z używaniem bc:

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

(zakładając, że twoja powłoka to obsługuje).

Jeśli wolisz to jako funkcję:

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

Zapisz cdefinicję w swoim ulubionym pliku startowym powłoki, jeśli chcesz, aby była zawsze dostępna.


2
bc<RET>236-128<RET>quit<RET>to 16 naciśnięć klawiszy. bc<<<"236-128"<RET>to 15 naciśnięć klawiszy. Nie to, co nazwałbym „znacznie zmniejszoną ilością pisania” :-) Ponadto bcmożna wyjść z niego ^D, więc pierwsza opcja została zredukowana do 13 naciśnięć klawiszy (licząc ^Djako dwa).
L. Levrel,

Racja, chodzi bardziej o gadatliwość ;-).
Stephen Kitt

2
@ L.Levrel Dzięki tej funkcji c 1+1właśnie tego potrzebowałem! :-) (odpowiedź zaktualizowana, aby była bardziej przejrzysta)
Fabby

A jeśli wykonasz zmiennoprzecinkowy: skala c '= 2; 17/3 ”(lub lepiej, skaluj zmienną używaną w funkcji„ c () ”i określ jej wartość, gdy będziesz potrzebować n cyfr dziesiętnych. Domyślnie jest to 0.)
Olivier Dulac

1
Zamiast tego użyj bc -ldefinicji funkcji, aby zwiększyć jej możliwości.
Izaak

22

Muszla

Najprostszym obliczono w CLI jest CLI (shell) sam (Jeśli IFSto ustawienie domyślne):

$ echo $(( 22 + 333 ))
355

Spacje można pominąć:

$ echo $((22*333))
7326

Ponieważ jest on częścią POSIX, prawie wszystkie powłoki mają go. I zawiera większość funkcji matematycznych języka C (oprócz tego, że zsh ma inny priorytet, ustaw C_PRECEDENCES, aby przywrócić mu zgodną wartość):

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

A niektóre muszle mają większość składni języka C matematyki (w tym przecinkiem):

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

Ale to tylko matematyka na liczbach całkowitych (i zwykle mniej niż 2 63 we współczesnych systemach operacyjnych) w niektórych powłokach:

$ echo $((1234/3))
411

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

Niektóre muszle mogą wykonywać matematykę pływającą:

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

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

Unikaj zsh (zcalc ma podobne problemy):

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

Radzę unikać expr, czasem potrzebuje dziwnych ucieczek:

$ expr 22 \* 333
7326

pne

Na następnym poziomie jest ( także POSIX ) bc(kuzyn RPN dc)

$ echo '22*333' | bc
7326

$ echo '22 333 * p' | dc
7326

dc Był POSIX ale został usunięty w 2017 roku .

Krótszy, jeśli twoja powłoka go obsługuje:

$ bc <<<'22*333'
7326

Lub nawet:

$ <<<'22*333' bc
7326

Oba są kalkulatorami o dowolnej precyzji z pewnymi wewnętrznymi funkcjami matematycznymi:

$ bc <<<2^200
1606938044258990275541962092341162602522202993782792835301376

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

awk

Po tych naprawdę podstawowych narzędziach do kalkulacji musisz przejść do innych języków

$ 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

funkcjonować

Możesz zdefiniować funkcję dowolnej z powyższych opcji:

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
}

I użyć:

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

20

Czytając komentarze na tych stronach , widzę program o nazwie UNIX / Linux, calcktóry robi dokładnie to, co chcesz. Jeśli na Debianie / Ubuntu / pochodnych:

sudo apt-get install apcalc

wtedy możesz:

calc 236-192

a jeśli dodać alias alias c='calc'do swojego .bashrcczy /etc/bash.bashrcto po prostu staje się:

c 1+1

w wierszu poleceń.


1
Nie idealny, ale wystarczająco dobry, aby uzyskać poparcie. Nieporozumienie poprawione na czacie i przegłosowane usunięte przez innego użytkownika . Usunąłem własną (gorszą) odpowiedź ... ;-)
Fabby


9

unitsProgramu, podczas gdy nie ma być używany jako kalkulator, faktycznie działa całkiem dobrze jako jeden.

$ units "236-192"
    Definition: 44
$ 

Jeśli w wyrażeniu są spacje, to wyrażenie musi być chronione cytatem.
Obsługuje wykładnicze i głębokie zagnieżdżanie nawiasów


3
To wszechstronny: units -t -d 10 "236GB - 192GB" GBwyjść 44, units -t -d 15 "236GB - 192GB" byteswyjść 44000000000, itp
AGC

6

Jak zauważono w komentarzu do wcześniejszej odpowiedzi, standardowa powłoka (ba) sh pozwala na ocenę wyrażeń arytmetycznych $((...)). Nie mogłem dokładnie sprawdzić, czy jest to część standardu POSIX, ale sprawdziłem, czy działa również na Cygwin i powłoce Mingw32.

Aby zobaczyć wynik, naprawdę musiałbyś pisać echo $((...)), co czyni niektóre znaki bardziej niż (interaktywne użycie) bc. Jednak aby użyć wyniku w skrypcie, najprawdopodobniej będzie on krótszy niż bcrozwiązanie (którym może być np `echo ...|bc`.).

Jeśli chodzi o gadatliwość, bcpolecenie pozwala na opcję, -qktóra tłumi wyjście „normalnego bcpowitania GNU ” .

Na koniec, uwaga na marginesie, zwróćmy uwagę, że bcnie jest to tylko kalkulator, ale pełnoprawny język programowania (w tym funkcje zdefiniowane przez użytkownika, pętle while i for itp.). Kolejny fakt, który sugeruje preferowanie wbudowanych możliwości arytmetycznych dla takich prostych obliczeń, zamiast zewnętrznego programu. To powiedziawszy, wyodrębnianie danych dla danych numerów partycji i radzenie sobie z sufiksami „M”, „G”, jak wydawało się wymagać pierwotnego pytania, może (g)awkraczej wymagać bc.

Źródła: https://www.gnu.org/software/bc/manual/html_mono/bc.html https://www.gnu.org/software/gawk/manual/html_node/Getting-Started.html


Dzięki! Doskonała pierwsza odpowiedź! +1
Fabby

2
$((...))nazywa się rozszerzeniem arytmetycznym i jest częścią POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/… Dla mnie największą wadą tej funkcji powłoki POSIX jest to, że obsługuje tylko arytmetykę liczb całkowitych :(
pabouk

6

W Zsh robię:

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

W bash musiałbym wyraźnie wspomnieć o cat:

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

Gdybym chciał, aby wynik zawierał cyfry ułamkowe (działa w Zsh, a nie w bash), dodałbym punkt radix do jednego z operandów

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

7
echo $((236 - 128))też działa ;-).
Stephen Kitt

Unikać zsh: zsh -c 'print $((12345678901234567890123 + 1))' zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1 -1363962815083169259.
Izaak

@Isaac przynajmniej zsh mówi ci, że się obcinają; bash po prostu daje niepoprawną odpowiedź bez narzekania.
Stephen Kitt

@StephenKitt Problem z zsh jest bardziej złożony niż pokazuje jedno wyjście. Porównaj: zsh -c 'print $((12345678901234567890123 + 1))'i zsh -c 'print $((123456789012345678901 + 1))'. Obcina się przy różnych długościach i daje różne wyniki liczbowe.
Izaak

@StephenKitt Zamiast tego Bash postępuje zgodnie z instrukcją (i językiem C o przepełnieniu podpisanej int). Nie to, że osobiście mi się podoba, ale jest tak udokumentowane. Spróbuj bash -c 'echo $((1<<63))'i `` bash -c '' echo $ (((1 << 63) -1)) ''.
Izaak

6

Osobiście lubię libqalculate (wersja Qalculate z wiersza poleceń ).

$ qalc
> 236-192

  236 - 192 = 44

Chociaż interfejs jest z pewnością prosty, (lib) qalculate to potężny, pełnoprawny kalkulator. na przykład

> fibonacci(133) to hex

  fibonacci(133) = approx. 0x90540BE2616C26F81F876B9

> 100!

  factorial(100) = approx. 9.3326215E157

> sin(pi)

  sin(pi * radian) = 0

Wykonuje także przydatne czynności, takie jak uzupełnianie tabulatorów, otwieranie / zamykanie nawiasów w razie potrzeby i drukuje interpretację zapytania.

> 18-2)/4

  (18 - 2) / 4 = 4

Aby wyjść, po prostu naciskam Ctrl+ d.

Aby uzyskać jeszcze szybszy dostęp, ustaw na coś podobnego alias ca='qalc'.


Przeczytałem spis treści instrukcji, ale nie mogłem znaleźć nic na temat CLI. (+1 w międzyczasie)
Fabby

1
Dzięki @Fabby. Byłem zdezorientowany, a część CLI jest nieco inna. Zaktualizowałem odpowiedź, aby wyjaśnić.
Sparhawk

Chciałbym móc dwukrotnie cię głosować! ;-)
Fabby

4

Python otwarty w innej zakładce?

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
>>>

Nie, niezupełnie, ale i tak fajny pomysł! :-) +1
Fabby

PowerShell może również zrobić to samo
phuclv

1
@phuclv tak, ale nikt nie lubi PS
Dev

3
@Dev ton uniksowych ludzi kocha PS
phuclv

2

dc -e '236 192-p'

... oczywiście, jeśli nie jesteś zaznajomiony dci potrzebujesz więcej niż odejmowania dwóch liczb, poświęcisz więcej czasu na zastanawianie się, jak używać dc(i może ogólnie RPN ), niż zaoszczędzisz dzięki bardziej znanym metodom.


Tak, miałem 3-minutowe spojrzenie na Kalkulator biurkowy i wiedziałem, że to nie dla mnie: byłem studentem, a nie studentem HP.
Fabby,

2

Jeśli masz zainstalowaną gradle, masz groovy ...

Jeśli groovy jest poprawnie załatany, powinieneś móc użyć:

groovy -e "println 1+1"

Może to wydawać się nieco zbędne w przypadku wszystkich innych przykładów, ale:

  • groovy to potężny język
  • prawdopodobnie najlepsza dostępna obsługa bibliotek
  • potężne i proste funkcje matematyczne (jak matematyka o dowolnej precyzji)
  • używa przekierowalnego standardowego wyjścia, dzięki czemu jest niezwykle elastyczny (świetnie nadaje się do stosowania w plikach wsadowych z backtickami `` i tym podobnych).

Jeśli nie masz zainstalowanej Java, prawdopodobnie nie warto instalować Groovy & Javy - jest to tylko opcja, jeśli Groovy jest już dostępny.


Nie, niezupełnie, ale i tak fajny pomysł! :-) +1
Fabby

2

Próbowałeś concalc ?

Opis: kalkulator konsoli concalc to kalkulator dla konsoli Linux. Jest to tylko parser-algorytm extcalc spakowany w prosty program konsoli. Możesz go użyć, jeśli potrzebujesz kalkulatora w powłoce. concalc potrafi także uruchamiać skrypty napisane w języku programowania podobnym do C.

$ concalc 1+1
2
$ concalc sqrt2
1.41421356237309505

Zainstaluj za pomocą:

sudo apt-get install concalc

1
dowód ... Graag gedaan ... :-D
Fabby

2

Zanim opublikowano inne genialne odpowiedzi, ostatecznie stworzyłem skrypt /usr/local/bin/czawierający:

#!/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

więc: pisanie c 1+1daje 2! :-)

Uwaga 1: Użyłem, cponieważ to polecenie nie istnieje w żadnym systemie uniksowym, który mogłem znaleźć. Jeśli miałbyś alias do swojego kompilatora c, użyj czegoś innego, co jest krótkie i nie używasz.
Uwaga 2: Źródło


1
(1) Zdecydowałem się użyć echo "$*" | bc -ljako szewu, którego używałeś /bin/shi nie wiem, czy masz dostępne ksh / bash / zsh. (2) Pamiętaj, że możesz zmienić skalę, aby obliczyć, wykonując na przykład skalę `c '= 60; 777/333'. Mam nadzieję, że to pomoże @Fabby
Izaak,

1

Jeśli jest zainstalowany Python, możesz wykonywać wiele operacji matematycznych za pomocą wiersza poleceń. Próbowałem podać poniżej przykład.

Użyłem, python3że możesz użyć python. Różnica pomiędzy pythoni python3występuje, gdy podzielone (frakcyjną) działanie występuje, w celu uniknięcia kwestii patrz poniżej pytona vs python3 .

Uwaga: Najnowsze wszystkie linux dist są domyślnie dostarczane zarówno z Python 2.7, jak i Python 3.5. W razie potrzeby instalacji Pythona kliknij tutaj .

Dodawanie, odejmowanie, mnożenie i dzielenie:

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

Moduł - pozostałość podziału:

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

Podział pięter:

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

Wykładnik - x do potęgi y (x ^ y):

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

Pierwiastek kwadratowy (np .: √4 = 2):

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

Bardziej naukowa część, będziesz potrzebować importowanej biblioteki matematycznej . Dawny:

Logarytm naturalny x = log (x):

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

Logarytm dziesiętny podstawy x = log10 (x):

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

Silnia (np .: 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

Aby zobaczyć więcej funkcji związanych z matematyką, sprawdź tutaj .

pythonVs python3:

-Dla podziału: (użyj pływaka):

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

-zamiast

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

Możesz także użyć terminalu bezpośredniego:

$ 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
>>> 

Otóż ​​to. Miłego kodowania!


0

Albo bcalbo qalc.


Aby automatycznie mieć bczawsze zaokrąglanie do dwóch cyfr: (uruchamianie go przy użyciu -ljest niewygodne na co dzień)

Edytuj swój ~/.bashrc:

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

Otwórz nową powłokę i biegnij bctam.


-1

Tworzenie jednowarstwowego:

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

Teraz możesz użyć prostej matematyki liczb całkowitych:

$ c 1+1
2

$ c 25*4
100

$ c 25*4-10
90

$ c 20*5/4
25

Jest to już omówione w odpowiedzi Izaaka .
Stephen Kitt

@StephenKitt Tak, głosowałem za bardzo szczegółową odpowiedzią Izaaka. Pomyślałem, że pomocny byłby jeden linijka podsumowująca niektóre z jego wpisów. ${1}Wykorzystanie parametr jest unikalny dla wszystkich odpowiedzi.
WinEunuuchs2Unix

2
Zachęcam do zapoznania się z przyczynami, dla których inne odpowiedzi nie wykorzystują ${1};-)
Stephen Kitt
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.