Perkalian pada terminal baris perintah

115

Saya menggunakan terminal serial untuk memberikan masukan ke percobaan lab kami. Saya menemukan itu menggunakan

$ echo "5X5"

hanya mengembalikan string "5X5". Apakah ada perintah untuk menjalankan operasi perkalian?

bouncingHippo
sumber

Jawaban:

45

Untuk matematika yang lebih maju dan tepat pertimbangkan menggunakan bc (1).

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

Metode Internal

Bash mendukung ekspansi aritmatika dengan $(( expression )). Sebagai contoh:

$ echo $(( 5 * 5 ))
25

Metode Eksternal

Sejumlah utilitas menyediakan aritmatika, termasuk bc dan expr .

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

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

Solusi klasiknya adalah:

 expr 5 \* 5

Pilihan bagus lainnya adalah:

 echo 5 5\*p | dc

Kedua solusi ini hanya akan bekerja dengan operan integer.

William Pursell
sumber
1
dcbekerja dengan pelampung. Coba echo '4 k 50 7 / p' | dc. Outputnya adalah 7.1428. The kperintah set presisi.
Dijeda sampai pemberitahuan lebih lanjut.
@ Dennis Dalam dua implementasi yang berbeda dari dc, saya melihat operasi float bekerja tanpa menetapkan melalui k. Saya pasti ingat presisi default menjadi 0 (pemotongan menjadi integer). Apakah saya salah mengingat, atau apakah penerapan yang lebih baru telah mengubah perilaku?
William Pursell
Saya dcjarang menggunakan selama bertahun-tahun karena saya lebih aljabar dan kurang RPN jadi saya tidak ingat. Pada sistem GNU yang saya gunakan, defaultnya adalah 0. manHalaman FreeBSD lama (1993) menyebutkan defaultnya nol, tetapi manhalaman BSD yang lebih lama tidak.
Dijeda sampai pemberitahuan lebih lanjut.
Ngomong-ngomong (untuk pembaca selanjutnya), contoh saya seharusnya menunjukkan operan non-integer alih-alih hanya hasil non-integer untuk secara akurat melawan pernyataan tersebut. Jangan takut, echo '4 k 50.5 7 / p' | dcbekerja (output :) 7.2142.
Dijeda sampai pemberitahuan lebih lanjut.
8

Fungsi shell sederhana (tidak diperlukan sed) harus melakukan trik menafsirkan '5X5'

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

Saya menggunakan fungsi ini yang menggunakan bcdan dengan demikian mendukung perhitungan floating point:

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

Contoh:

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

Ekspansi aritmatika Bash tidak mendukung pelampung (tapi Korn shell dan zsh mendukungnya).

Contoh:

$ ksh -c 'echo "$((3.0 / 4))"'
0.75
Dijeda sampai pemberitahuan lebih lanjut.
sumber
4

Saya memiliki skrip sederhana yang saya gunakan untuk ini:

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

#!/bin/sh

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

Ini perubahan xuntuk *karena *merupakan karakter khusus di shell. Gunakan sebagai berikut:

  • c 5x5
  • c 5-4.2 + 1
  • c '(5 + 5) * 30' (Anda masih harus menggunakan tanda kutip jika ekspresi tersebut berisi tanda kurung).
Kami Semua Monica
sumber
Saya suka ide Anda untuk menggunakan "x" untuk perkalian. Anda juga bisa menggunakan tanda kurung siku alih-alih tanda kurung untuk menghindari perlunya kutipan. trdapat digunakan untuk melakukan pemetaan karakter untuk beberapa karakter.
Dijeda sampai pemberitahuan lebih lanjut.
3

Jika Anda suka python dan memiliki opsi untuk menginstal paket, Anda dapat menggunakan utilitas yang saya buat ini.

# 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
bom
sumber