Basit komut satırı hesaplayıcısı


19

Konu:

Arada sırada bir komut satırı ortamında basit aritmetik yapmam gerekiyor. EG aşağıdaki çıktıyı verdi:

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)

Komut satırında hesaplamanın basit bir yolu nedir , bölüm 3 ve 5 arasındaki ayrılmamış alanın boyutunu ?

Zaten denedim:

M.Ö

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

nerede cesur üzerindeki tüm Ben basit yapmak yazmanıza gerek şeyler 236-192olarak bc 1+1yankılarıFile 1+1 is unavailable.

İfade

expr 236 - 192

burada sadece yankılar olarak operatörden önce ve sonra boşluklarexpr 1+1 yazmam gerekiyor 1+1.


3
Etkileşimli Bunu yapmak niyetinde iseniz, yazmak gerekmez quitiçine bc; ctrl-Dherhangi bir etkileşimli programda olduğu gibi düğmesine basılacaktır.
marcelm

2
dc(IMO) çok daha üstündür bc.
William Pursell

1
Ben düşünüyorum 192 değil, 236 - - 128 PTN 3 ile 5 arasında ayrılmamış alan 236 olmalıdır?
Dijital Travma

@DigitalTrauma iyi göz! (Bu sadece bir örnekti ve kimse bunu fark etmedi!)
Fabby

1
@JanM. Ben yoksun olan benim .... ;-)
Fabby

Yanıtlar:


33

Kullanırken kullanılan ayrıntı düzeyini büyük ölçüde azaltabilirsiniz bc:

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

(kabuğunuzun bunu desteklediği varsayılarak).

Bunu bir işlev olarak görmeyi tercih ediyorsanız:

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

Mağaza cbunu her zaman kullanılabilir yapmak istiyorsanız favori kabuk başlangıç dosyasındaki tanımı.


2
bc<RET>236-128<RET>quit<RET>16 tuş vuruşudur. bc<<<"236-128"<RET>15 tuş vuruşudur. Ben "yazarak büyük ölçüde azaltılmış miktarı" dediği değil :-) Buna ek olarak, bcçıkılabilir ^D, bu yüzden ilk seçenek 13 tuş vuruşları ( ^Diki sayma ) azaltılır .
L. Levrel

Doğru, daha çok ayrıntı ;-).
Stephen Kitt

2
@ L.Levrel Fonksiyonu ile tam c 1+1da ihtiyacım olan şey bu! :-) (cevap daha net hale getirmek için güncellendi)
Fabby

Kayan nokta yaparsanız: c 'scale = 2; 17/3 '(veya daha iyisi,' c () 'işlevi içinde kullanılan bir değişkeni ölçeklendirin ve n ondalık basamağa ihtiyacınız olduğunda değerini tanımlayın. Varsayılan değer 0'dır.)
Olivier Dulac

1
Daha bc -ltanımlamak için işlev tanımında kullanın.
Isaac

22

Kabuk

En basit (Eğer CLI kalk CLI (kabuk) kendisidir IFSvarsayılan):

$ echo $(( 22 + 333 ))
355

Alanlar atlanabilir:

$ echo $((22*333))
7326

Olduğu gibi POSIX oluşumu hemen hemen tüm kabuklar o var. Ve C dili matematik işlevlerinin çoğunu içerir (zsh'nin farklı bir önceliği olması dışında, C_PRECEDENCES'i uyumlu bir değere geri yüklemek için ayarlayın):

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

Ve bazı kabuklar C dili matematik sözdiziminin çoğuna sahiptir (virgül dahil):

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

Ancak bazı kabuklarda yalnızca tamsayı matematiktir (ve günümüz işletim sistemlerinde genellikle 2 63'ten azdır ):

$ echo $((1234/3))
411

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

Bazı mermiler yüzen matematik yapabilir:

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

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

Zsh'den kaçının (zcalc benzer problemlere sahiptir):

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

Kaçınmanızı öneririm expr, bazen garip kaçışlara ihtiyaç duyar:

$ expr 22 \* 333
7326

M.Ö

Bir sonraki seviyede ( ayrıca POSIX ) bc(RPN'in kuzeni dc)

$ echo '22*333' | bc
7326

$ echo '22 333 * p' | dc
7326

dc Oldu POSIX ama 2017 yılında kaldırıldı var .

Kabuğunuz destekliyorsa daha kısa:

$ bc <<<'22*333'
7326

Ya da:

$ <<<'22*333' bc
7326

Her ikisi de bazı dahili matematik fonksiyonlarına sahip rastgele hassasiyet hesaplayıcılarıdır:

$ bc <<<2^200
1606938044258990275541962092341162602522202993782792835301376

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

awk

Bu gerçekten temel kalk araçlarından sonra , diğer dillere gitmeniz gerekiyor

$ 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

fonksiyon

Yukarıdaki seçeneklerden herhangi birinin bir işlevini tanımlayabilirsiniz:

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
}

Ve kullan:

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

20

Bu sayfalardaki yorumları okurken calc, tam olarak ne istediğinizi yapan bir UNIX / Linux programı görüyorum . Debian / Ubuntu / türevlerinde ise:

sudo apt-get install apcalc

o zaman yapabilirsin:

calc 236-192

ve alias c='calc'sitenize bir takma ad eklerseniz .bashrcveya /etc/bash.bashrco zaman olur:

c 1+1

komut satırında.


1
Mükemmel değil, ama bir upvote için yeterince iyi. Sohbet ve yanlış oylamada yanlış anlama düzeltildi, diğer kullanıcı tarafından kaldırıldı . Kendi (düşük) cevabımı
sildim


9

unitsBir hesap makinesi olarak kullanılmak üzere tasarlanmamıştır iken programı, aslında biri olarak oldukça iyi çalışıyor.

$ units "236-192"
    Definition: 44
$ 

İfadede boşluklar varsa , ifadenin alıntı korumalı olması gerekir.
Üstelleri ve braketlerin derin yuvalanmasını destekler


3
Çok yönlü: units -t -d 10 "236GB - 192GB" GBçıktılar 44, units -t -d 15 "236GB - 192GB" bytesçıktılar 44000000000, vb.
agc

6

Önceki bir cevaba yapılan bir yorumda belirtildiği gibi, standart kabuk (ba) sh, içindeki aritmetik ifadelerin değerlendirilmesine izin verir $((...)). Bunun POSIX standardının bir parçası olup olmadığını iki kez kontrol edemedim, ancak Cygwin ve Mingw32 kabuğunda da çalıştığını kontrol ettim.

Sonucu görmek için gerçekten yazmanız gerekir echo $((...)), bu da bazı karakterleri (etkileşimli kullanımı) 'dan daha fazla yapar bc. Ancak, sonucu bir komut dosyasında kullanmak için, bu büyük olasılıkla bcçözümden daha kısa olacaktır (örneğin,`echo ...|bc` ).

Ayrıntılarla ilgili olarak, bckomut "normal GNU karşılama"-q çıktısını baskılayan seçeneğe izin verirbc .

Son olarak, biraz sınırda bir açıklama olarak, bcbunun sadece bir hesap makinesi değil, tam teşekküllü bir programlama dili (kullanıcı tanımlı işlevler dahil, döngüler vb. İçin) dahil olduğunu unutmayın. Harici bir program yerine bu basit hesaplamalar için yerleşik aritmetik yetenekleri tercih etmeyi öneren bir başka gerçek. Bu orjinal soru için diyebilirsiniz, istemeye gibiydi olarak, verilen bölüm numarası (ler) için veri ayıklama ve "M", "G" soneklerinin ile uğraşan dedi (g)awkziyadebc .

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


Teşekkürler! Mükemmel ilk cevap! +1
Fabby

2
$((...))Aritmetik Genişleme olarak adlandırılır ve POSIX'in bir parçasıdır: pubs.opengroup.org/onlinepubs/9699919799/utilities/… Benim için POSIX kabuğunun bu özelliğinin en büyük dezavantajı, yalnızca tamsayı aritmetiği desteklemesidir :(
pabouk

6

Ne zsh yapmak:

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

Bash'da kediden açıkça bahsetmek zorundayım:

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

Sonucun kesirli basamaklar içermesini isteseydim (bash değil zsh olarak çalışır), işlenenlerden birine bir sayı tabanı eklerdim

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

7
echo $((236 - 128))çok çalışır ;-).
Stephen Kitt

Zsh kaçının: zsh -c 'print $((12345678901234567890123 + 1))' zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1 -1363962815083169259.
Isaac

@Isaac en azından zsh'ın kesildiğini söylüyor; bash sadece şikayet etmeden yanlış bir cevap verir.
Stephen Kitt

@StephenKitt zsh ile ilgili sorun, bir çıktının gösterdiklerinden daha karmaşıktır. Karşılaştır: zsh -c 'print $((12345678901234567890123 + 1))'ve zsh -c 'print $((123456789012345678901 + 1))'. Farklı uzunluklarda kesiliyor ve farklı sayısal sonuçlar üretiyor.
Isaac

@StephenKitt Bunun yerine Bash kılavuzu (ve imzalı bir int'in taşmasıyla ilgili C dilini) izliyor. Kişisel olarak sevdiğimden değil, öyle belgeleniyor. Deneyin bash -c 'echo $((1<<63))'ve `` bash-c 'echo $ (((1 << 63) -1))' '.
Isaac

6

Şahsen ben libqalculate ( Qalculate'ın komut satırı sürümü) hoşuma gidiyor .

$ qalc
> 236-192

  236 - 192 = 44

Arayüz kesinlikle basit olsa da, (lib) qalculate güçlü, tam teşekküllü bir hesap makinesidir. Örneğin

> fibonacci(133) to hex

  fibonacci(133) = approx. 0x90540BE2616C26F81F876B9

> 100!

  factorial(100) = approx. 9.3326215E157

> sin(pi)

  sin(pi * radian) = 0

Ayrıca sekme tamamlama, gerektiğinde parantezleri açma / kapatma gibi yararlı şeyler yapar ve sorguyu yorumlamasını yazdırır.

> 18-2)/4

  (18 - 2) / 4 = 4

Çıkmak için Ctrl+d .

Daha hızlı erişim için, benzer bir şeye ayarlayın alias ca='qalc'.


Kılavuzun TOK'unu okudum ama CLI hakkında hiçbir şey bulamadım. (Bu arada +1)
Fabby

1
Teşekkürler @Fabby. Kafam karıştı ve CLI kısmı aslında biraz farklı. Cevabı açıklığa kavuşturmak için güncelledim.
Sparhawk

Keşke seni iki kez oylayabilseydim! ;-)
Fabby

4

Python başka bir sekmede açıldı mı?

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

Hayır, gerçekten değil, ama yine de düzgün bir fikir! :-) +1
Fabby

powershell de aynı şeyi yapabilir
phuclv

1
@phuclv evet, ama kimse PS'den hoşlanmıyor
Dev

3
@Dev ton Unix insan PS seviyorum
phuclv

2

dc -e '236 192-p'

... elbette, aşina dcdeğilseniz ve iki sayıyı çıkarmaktan daha fazlasına ihtiyacınız varsa, nasıl kullanacağınızı dc(ve genel olarak RPN'i ) daha tanıdık yöntemlerle kaydedeceğinizden daha fazla zaman harcayacaksınız .


Evet, Desk Calculator'a 3 dakikalık bir bakışla baktım ve benim için olmadığını biliyordum: Ben bir HP öğrencisi değil bir TI'ydım.
Fabby

2

Eğer kepçe yüklü varsa o zaman groovy var ...

Groovy doğru bir şekilde yönlendirilirse aşağıdakileri kullanabilirsiniz:

groovy -e "println 1+1"

Bu, diğer tüm örneklerle biraz gereksiz görünebilir, ancak:

  • groovy güçlü bir dildir
  • muhtemelen mevcut en iyi kütüphane desteği
  • güçlü ve basit matematik fonksiyonları (keyfi hassas matematik gibi)
  • çıktısı için yeniden yönlendirilebilir stdout kullanır, bu yüzden inanılmaz derecede esnektir (backticks ile toplu iş dosyalarının içinde kullanmak harika `` ve benzeri).

Java yüklü değilse muhtemelen groovy & java yüklemeye değmez - groovy zaten mevcutsa sadece bir seçenektir.


Hayır, gerçekten değil, ama yine de düzgün bir fikir! :-) +1
Fabby

2

Concalc'i denediniz mi?

Açıklama: konsol hesap concalc Linux konsolu için bir hesap makinesidir. Bu basit bir konsol programı içine paketlenmiş extcalc çözümleyici algoritmasıdır. Kabuğunuzda bir hesap makinesine ihtiyacınız varsa kullanabilirsiniz. concalc ayrıca C benzeri bir programlama dilinde yazılmış komut dosyalarını çalıştırabilir.

$ concalc 1+1
2
$ concalc sqrt2
1.41421356237309505

Yükleme yeri:

sudo apt-get install concalc

1
kanıt ... Graag gedaan ... :-D
Fabby

2

Diğer parlak cevaplar gönderilmeden önce, aşağıdakileri /usr/local/bin/ciçeren komut dosyasını oluşturdum :

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

yani: yazma c 1+1verimliliği2 ! :-)

Not 1: kullandığım co komut bulabildiğim herhangi Unix sistemde mevcut değil çünkü. Bunu c derleyicinize taklit ettiyseniz, kısa olan ve kullanmadığınız başka bir şey kullanın.
Not 2: Kaynak


1
(1) kullandığınız echo "$*" | bc -lshebang olarak kullanmaya karar verdi /bin/shve ksh / bash / zsh kullanılabilir olup olmadığını bilmiyorum. (2) Örneğin hesaplamak için ölçeği değiştirebileceğinizi unutmayın, örneğin `c 'ölçeği = 60; 777/333'. Umarım yardımcı olur @Fabby
Isaac

1

Python yüklüyse, komut satırından çok sayıda matematiksel işlem yapabilirsiniz. Aşağıda bazı örnekler vermeye çalıştım.

Ben kullandım python3kullanabilirsiniz python. Bölünmüş (kesirli) işlem arasındaki fark pythonve python3gerçekleşme, sorunu önlemek için python vs python3'e bakın .

Not: En son tüm linux dağıtımları varsayılan olarak hem Python 2.7 hem de Python 3.5 ile birlikte gelir. Python yüklemeniz gerekiyorsa buraya tıklayın .

Toplama, Çıkarma, Çarpma ve Bölme:

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

Modül -bölümün hatırlatıcısı:

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

Kat bölümü:

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

Üs - x, y'nin gücüne (x ^ y):

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

Karekök (ör: √4 = 2):

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

Daha bilimsel bölüm, ithalat matematik kütüphanesine ihtiyacınız olacak . Ör:

X = log (x) 'ın doğal logaritması:

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

X = log10 (x) 'in baz-10 logaritması:

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

Faktöriyel (ör: 3! = 3.2.1 = 6):

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

TRİGONOMETRİ sin(x), cos(x), tan(x):

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

Daha fazla matematik ile ilgili fonksiyonlar için buraya bakın .

pythonVs python3:

-Bölmek için: (şamandıra kullanın):

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

-onun yerine

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

Ayrıca doğrudan terminal kullanabilirsiniz:

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

Bu kadar. Mutlu kodlama!


0

Ya bcya qalc.


Otomatik olarak bcher zaman iki rakama yuvarlamak için: (-l günlük işler için kullanışsızdır)

Düzenleyin ~/.bashrc:

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

Yeni bir mermi aç ve bcoraya koş .


-1

Tek astar oluşturma:

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

Şimdi basit tamsayı matematiğini kullanabilirsiniz:

$ c 1+1
2

$ c 25*4
100

$ c 25*4-10
90

$ c 20*5/4
25

Bu zaten Isaac'ın cevabında tartışıldı .
Stephen Kitt

@StephenKitt Evet Isaac'in çok ayrıntılı cevabını iptal ettim. Gönderdiği bazı şeyleri özetleyen bir astarın yararlı olacağını düşündüm. ${1}Parametre kullanımı tüm cevaplar için benzersizdir.
WinEunuuchs2Unix

2
Diğer cevapların kullanmama nedenlerine bakmanızı ${1}
öneririm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.