Kalkulator baris perintah sederhana

19

Isu:

Sesekali saya perlu melakukan aritmatika sederhana di lingkungan baris perintah. EG diberikan output berikut:

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)

Apa cara sederhana untuk menghitung pada baris perintah ukuran ruang yang tidak dialokasikan antara partisi 3 dan 5?

Apa yang sudah saya coba:

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

di mana huruf tebal di atas adalah semua hal yang perlu saya ketik untuk melakukan yang sederhana 236-192seperti bc 1+1gemaFile 1+1 is unavailable.

expr

expr 236 - 192

di mana saya perlu mengetik spasi sebelum dan sesudah operator sebagai expr 1+1gema saja 1+1.

Fabby
sumber
3
Jika Anda berniat untuk melakukan hal ini secara interaktif, Anda tidak perlu mengetik quitke dalam bc; menekan ctrl-Dakan dilakukan, seperti halnya dalam program interaktif apa pun.
marcelm
2
dcadalah (IMO) jauh lebih unggul daripada bc.
William Pursell
1
Saya pikir ruang yang tidak terisi antara ptn 3 dan 5 harus 236 - 192, dan bukan 236 - 128?
Digital Trauma
@DigitalTrauma mata yang bagus! (Itu hanya contoh dan tidak ada yang melihat itu!)
Fabby
1
@ Jan. Saya orang yang terbalik .... ;-)
Fabby

Jawaban:

33

Anda dapat sangat mengurangi jumlah verbosity yang terlibat dalam menggunakan bc:

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

(dengan asumsi shell Anda mendukung itu).

Jika Anda lebih suka memiliki itu sebagai fungsi:

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

Simpan cdefinisi dalam file startup shell favorit Anda jika Anda ingin membuatnya selalu tersedia.

Stephen Kitt
sumber
2
bc<RET>236-128<RET>quit<RET>adalah 16 penekanan tombol. bc<<<"236-128"<RET>adalah 15 penekanan tombol. Bukan apa yang saya sebut "jumlah pengetikan yang sangat berkurang" :-) Selain itu, bcdapat keluar dengan ^D, jadi opsi pertama dikurangi menjadi 13 penekanan tombol (dihitung ^Dsebagai dua).
L. Levrel
Benar, ini lebih banyak tentang kata kerja ;-).
Stephen Kitt
2
@ L.Levrel Dengan fungsi itu hanya c 1+1itulah yang saya butuhkan! :-) (jawaban diperbarui untuk membuatnya lebih jelas)
Fabby
Dan jika Anda melakukan floating point: c 'scale = 2; 17/3 '(atau lebih baik, buat skala variabel yang digunakan di dalam fungsi' c () ', dan tentukan nilainya kapan pun Anda perlu memiliki n angka desimal. Standarnya adalah 0.)
Olivier Dulac
1
Alih-alih menggunakan bc -ldefinisi fungsi untuk membuatnya lebih mampu.
Isaac
22

Kulit

The sederhana calc di CLI adalah CLI (shell) itu sendiri (Jika IFSadalah default):

$ echo $(( 22 + 333 ))
355

Spasi dapat dihilangkan:

$ echo $((22*333))
7326

Karena ini adalah bagian dari POSIX, hampir semua shell memilikinya. Dan itu termasuk sebagian besar fungsi matematika bahasa C (kecuali bahwa zsh memiliki prioritas yang berbeda, tetapkan C_PRECEDENCES untuk mengembalikannya ke nilai yang kompatibel):

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

Dan beberapa shell memiliki sebagian besar sintaks matematika bahasa C (termasuk koma):

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

Tapi itu hanya bilangan bulat matematika (dan biasanya kurang dari 63 pada OS saat ini) di beberapa shell:

$ echo $((1234/3))
411

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

Beberapa kerang bisa melakukan matematika mengambang:

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

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

Hindari zsh (zcalc memiliki masalah serupa):

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

Saya sarankan Anda untuk menghindarinya expr, terkadang perlu pelarian yang aneh:

$ expr 22 \* 333
7326

bc

Pada level selanjutnya adalah ( juga POSIX ) bc(sepupu RPN dc)

$ echo '22*333' | bc
7326

$ echo '22 333 * p' | dc
7326

The dc adalah POSIX tetapi mendapat dihapus pada tahun 2017 .

Lebih pendek jika shell Anda mendukungnya:

$ bc <<<'22*333'
7326

Atau bahkan:

$ <<<'22*333' bc
7326

Keduanya adalah kalkulator presisi acak dengan beberapa fungsi matematika internal:

$ bc <<<2^200
1606938044258990275541962092341162602522202993782792835301376

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

awk

Setelah alat calc yang benar-benar dasar , Anda perlu naik ke bahasa lain

$ 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

fungsi

Anda dapat mendefinisikan fungsi dari salah satu opsi di atas:

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
}

Dan gunakan:

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

Membaca komentar halaman ini , saya melihat program UNIX / Linux disebut calcyang tidak persis apa yang Anda inginkan. Jika pada Debian / Ubuntu / turunannya:

sudo apt-get install apcalc

maka kamu bisa:

calc 236-192

dan jika Anda menambahkan alias alias c='calc'ke Anda .bashrcatau /etc/bash.bashrchanya menjadi:

c 1+1

di baris perintah.

nomor 9
sumber
1
Tidak sempurna, tetapi cukup baik untuk upvote. Kesalahpahaman dikoreksi dalam obrolan dan downvote dihapus oleh pengguna lain . Menghapus jawaban (inferior) saya sendiri ... ;-)
Fabby
15

Dalam zsh:

$ autoload zcalc # best in  ~/.zshrc
$ zcalc
1> 1+1
2
2> ^D
$ zcalc 5+5
1> 10
2>
Stéphane Chazelas
sumber
9

The unitsProgram, sementara tidak dimaksudkan untuk digunakan sebagai kalkulator, benar-benar bekerja cukup baik sebagai salah satu.

$ units "236-192"
    Definition: 44
$ 

Jika ada spasi dalam ekspresi, maka ekspresi harus dilindungi kutipan.
Ini mendukung eksponensial dan bersarang kurung

CSM
sumber
3
Serbaguna: units -t -d 10 "236GB - 192GB" GBkeluaran 44, units -t -d 15 "236GB - 192GB" byteskeluaran 44000000000, dll.
agc
6

Seperti yang dikomentari dalam komentar pada balasan sebelumnya, shell standar (ba) sh memungkinkan untuk mengevaluasi ekspresi aritmatika di dalamnya $((...)). Saya tidak dapat memeriksa ulang apakah ini merupakan bagian dari standar POSIX, tetapi saya memang memeriksa apakah itu juga berfungsi pada Cygwin dan shell Mingw32.

Untuk melihat hasilnya, Anda memang harus mengetik echo $((...)), yang membuat beberapa karakter lebih dari (penggunaan interaktif) bc. Namun, untuk menggunakan hasil dalam skrip, ini kemungkinan besar akan lebih pendek daripada bcsolusinya (yang bisa jadi, misalnya, `echo ...|bc`).

Mengenai verbositas, bcperintah memungkinkan opsi -qyang menekan output dari " bcselamat datang GNU normal " .

Sebagai komentar akhir, sedikit batas, mari kita perhatikan bahwa bcini bukan hanya kalkulator tetapi juga bahasa pemrograman lengkap (termasuk fungsi yang ditentukan pengguna, sementara & untuk loop, dll.). Fakta lain yang menyarankan untuk lebih memilih kemampuan aritmatika built-in untuk perhitungan sederhana seperti itu, daripada program eksternal. Yang mengatakan, mengekstraksi data untuk nomor partisi yang diberikan dan berurusan dengan sufiks "M", "G", seperti yang ditanyakan oleh pertanyaan awal, mungkin lebih tepat disebut (g)awkbukan bc.

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

Maks
sumber
Terima kasih! Jawaban pertama yang bagus! +1
Fabby
2
$((...))disebut Ekspansi Aritmatika dan merupakan bagian dari POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/... Bagi saya kelemahan terbesar dari fitur shell POSIX ini adalah hanya mendukung aritmatika integer :(
pabouk
6

Apa yang saya lakukan di zsh adalah:

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

Dalam bash, saya harus menyebutkan secara eksplisit cat:

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

Jika saya ingin hasilnya menyertakan digit fraksional (bekerja di zsh, bukan di bash), saya akan menambahkan titik radix ke salah satu operan

$ <<< $(( 236 / 128 )) 
1
$ <<< $(( 236. / 128 ))
1.84375
JoL
sumber
7
echo $((236 - 128))bekerja juga ;-).
Stephen Kitt
Hindari zsh: zsh -c 'print $((12345678901234567890123 + 1))' zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1 -1363962815083169259.
Isaac
@Isaac, setidaknya zsh, memberi tahu Anda bahwa truncating; bash hanya memberi Anda jawaban yang salah tanpa mengeluh.
Stephen Kitt
@StephenKitt Masalah dengan zsh lebih kompleks dari satu output menunjukkan. Bandingkan: zsh -c 'print $((12345678901234567890123 + 1))'dan zsh -c 'print $((123456789012345678901 + 1))'. Ini memotong pada panjang yang berbeda dan menghasilkan hasil numerik yang berbeda.
Isaac
@StephenKitt Sebaliknya Bash mengikuti manual (dan bahasa C tentang overflow int yang ditandatangani). Bukan berarti saya pribadi suka, tetapi didokumentasikan seperti itu. Coba bash -c 'echo $((1<<63))'dan `` bash -c 'echo $ (((1 << 63) -1))' `.
Isaac
6

Secara pribadi, saya suka libqalculate (versi command-line dari Qalculate ).

$ qalc
> 236-192

  236 - 192 = 44

Meskipun antarmuka jelas sederhana, (lib) qalculate adalah kalkulator yang kuat dan lengkap. misalnya

> fibonacci(133) to hex

  fibonacci(133) = approx. 0x90540BE2616C26F81F876B9

> 100!

  factorial(100) = approx. 9.3326215E157

> sin(pi)

  sin(pi * radian) = 0

Ia juga melakukan hal-hal berguna seperti penyelesaian tab, buka / tutup tanda kurung bila perlu, dan cetak interpretasinya atas kueri.

> 18-2)/4

  (18 - 2) / 4 = 4

Untuk keluar, saya cukup tekan Ctrl+ d.

Untuk akses yang lebih cepat, atur ke sesuatu seperti alias ca='qalc'.

Sparhawk
sumber
Saya membaca TOC manual tetapi tidak menemukan apa pun tentang CLI. (+1 sementara itu)
Fabby
1
Terima kasih @ Fabby. Saya bingung, dan bagian CLI sebenarnya sedikit berbeda. Saya telah memperbarui jawaban untuk menjelaskan.
Sparhawk
Kuharap aku bisa membuatmu marah dua kali! ;-)
Fabby
4

Python terbuka di tab lain?

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
>>>
Michael Hearn
sumber
Tidak, tidak juga, tapi ide yang rapi! :-) +1
Fabby
PowerShell juga dapat melakukan hal yang sama
phuclv
1
@ phuclv ya, tapi tidak ada yang suka PS
Dev
3
@Dev, ton orang Unix suka PS
phuclv
2

dc -e '236 192-p'

... tentu saja, jika Anda tidak terbiasa dcdan Anda membutuhkan lebih dari mengurangi dua angka, Anda akan menghabiskan lebih banyak waktu mencari cara menggunakan dc(dan mungkin RPN secara umum) daripada Anda akan menghemat dengan metode yang lebih akrab.

Aaron Thomas
sumber
Ya, telah melihat 3 menit pada Desk Calculator dan tahu itu bukan untuk saya: Saya adalah seorang TI, bukan seorang siswa HP.
Fabby
2

Jika Anda telah menginstal gradle maka Anda ...

Jika groovy dilacak dengan benar, Anda harus dapat menggunakan:

groovy -e "println 1+1"

Ini mungkin tampak agak berlebihan dengan semua contoh lain, tetapi:

  • groovy adalah bahasa yang kuat
  • mungkin dukungan perpustakaan terbaik yang tersedia
  • fungsi matematika yang kuat dan sederhana (Seperti matematika presisi acak)
  • menggunakan stdout redirectable untuk outputnya sehingga sangat fleksibel (bagus untuk digunakan dalam file batch dengan backticks `` dan sejenisnya).

Jika Anda tidak menginstal java, mungkin tidak layak menginstal groovy & java - itu hanya opsi jika groovy sudah tersedia.

Bill K
sumber
Tidak, tidak juga, tapi ide yang rapi! :-) +1
Fabby
2

Sudahkah Anda mencoba concalc ?

Deskripsi: concalc kalkulator kalkulator adalah kalkulator untuk konsol Linux. Itu hanya parser-algoritma dari extcalc yang dikemas dalam program konsol sederhana. Anda dapat menggunakannya jika Anda membutuhkan kalkulator di shell Anda. concalc juga dapat menjalankan skrip yang ditulis dalam bahasa pemrograman mirip C.

$ concalc 1+1
2
$ concalc sqrt2
1.41421356237309505

Instal dengan:

sudo apt-get install concalc
Jan M.
sumber
1
proof ... Graag gedaan ... :-D
Fabby
2

Sebelum salah satu jawaban brilian lainnya diposting, saya akhirnya membuat skrip yang /usr/local/bin/cberisi:

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

jadi: ketikkan c 1+1hasil 2! :-)

Catatan 1: Saya menggunakan ckarena perintah itu tidak ada pada sistem Unix yang saya temukan. Jika Anda ingin mengatakan itu ke kompiler c Anda, gunakan hal lain yang pendek dan tidak Anda gunakan.
Catatan 2: Sumber

Fabby
sumber
1
(1) Memutuskan untuk menggunakan echo "$*" | bc -lshebang yang Anda gunakan dulu /bin/shdan saya tidak tahu apakah Anda memiliki ksh / bash / zsh. (2) Perhatikan bahwa Anda dapat mengubah skala untuk menghitung adalah Anda menjalankan `c 'skala = 60; 777/333', misalnya. Semoga ini bisa membantu @Fabby
Isaac
1

Jika python diinstal, Anda dapat melakukan banyak operasi matematika melalui baris perintah. Saya mencoba memberikan beberapa contoh di bawah ini.

Saya telah menggunakan python3yang dapat Anda gunakan python. Perbedaan antara pythondan python3terjadi ketika operasi dibagi (fraksional) terjadi, untuk menghindari masalah lihat di bawah python vs python3 .

Catatan: Terbaru semua dist linux dilengkapi dengan Python 2.7 dan Python 3.5 secara default. Jika perlu menginstal python klik di sini .

Tambahkan, Kurangi, Gandakan & Bagi:

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

Modulus - tetap dari divisi:

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

Divisi lantai:

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

Eksponen - x pangkat y (x ^ y):

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

Root kuadrat (mis: √4 = 2):

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

Bagian yang lebih ilmiah, Anda akan memerlukan perpustakaan matematika impor . Ex:

Logaritma natural x = log (x):

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

Logaritma basis-10 dari x = log10 (x):

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

Faktorial (mis: 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

Untuk lebih banyak fungsi terkait matematika, periksa di sini .

pythonVs python3:

-Untuk membagi: (gunakan float):

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

-dari pada

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

Anda juga dapat menggunakan terminal langsung:

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

Itu dia. Selamat coding!

AHJeebon
sumber
0

Entah bcatau qalc.


Untuk secara otomatis bcselalu membulatkan ke dua digit: (menjalankannya dengan -lberat untuk hal-hal sehari-hari)

Edit Anda ~/.bashrc:

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

Buka shell baru dan jalankan di bcsana.

sja
sumber
-1

Membuat satu garis:

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

Sekarang Anda dapat menggunakan matematika integer sederhana:

$ c 1+1
2

$ c 25*4
100

$ c 25*4-10
90

$ c 20*5/4
25
WinEunuuchs2Unix
sumber
Ini sudah dibahas dalam jawaban Ishak .
Stephen Kitt
@StephenKitt Ya saya mengubah jawaban Isaac yang sangat terperinci. Saya pikir satu baris meringkas beberapa dari apa yang dia posting akan sangat membantu. Penggunaan ${1}parameter unik untuk semua jawaban.
WinEunuuchs2Unix
2
Saya mendorong Anda untuk melihat alasan mengapa jawaban lain tidak digunakan ${1};-)
Stephen Kitt