Cara meneruskan hasil bc ke variabel

15

Saya sedang menulis skrip dan saya ingin meneruskan hasil dari bcmenjadi variabel. Saya telah mendeklarasikan 2 variabel ( var1dan var2) dan telah memberi mereka nilai. Dalam skrip saya, saya ingin meneruskan hasil dari bcke variabel lain katakan var3sehingga saya bisa bekerja dengan var3perhitungan lain. Sejauh ini saya sudah bisa menulis hasilnya ke file yang bukan yang saya cari dan juga saya sudah bisa mengulang hasilnya di terminal tetapi saya hanya ingin meneruskan hasilnya ke variabel saat ini sehingga Saya dapat bekerja dengan variabel itu.

echo "scale=2;$var1/var2" | bc
shaolin
sumber

Jawaban:

23

Jika Anda menggunakan bash, Anda sebaiknya menggunakan string di sini daripada pipa seperti pada:

bc <<< "scale=2;$var1/$var2"

Ini akan menghemat subkulit Anda.

Kemudian, untuk menyimpan output dari suatu perintah, gunakan substitusi perintah:

answer=$(bc <<< "scale=2;$var1/$var2")

Edit.

Jika Anda menginginkan sesuatu yang lebih keren daripada bc, inilah dc (kalkulator semir terbalik):

answer=$(dc <<< "2k $var1 $var2/p")
gniourf_gniourf
sumber
1
Ya saya menggunakan bash, bisakah Anda mengklarifikasi subkulit? Apakah ada kerugiannya?
shaolin
2
Setiap kali Anda menggunakan pipa |, perintah di sebelah kanan pipa dieksekusi dalam subkulit, dan dibutuhkan sumber daya untuk membuka subkulit baru (seperti membuka contoh baru bash untuk menjalankan perintah itu). Jika Anda bisa menghindarinya, hindarilah. Di sini, mengirimkan sebuah echoke bcakan menjalankan perintah bcdalam sebuah subkulit dan, dalam beberapa hal, terbelakang (jangan tersinggung), karena bash memiliki konstruk string yang indah <<<untuk menghindari hal-hal bodoh seperti ini.
gniourf_gniourf
@ gniourf_gniourf Kemudian lagi, jika Anda peduli tentang penggunaan sumber daya, Anda akan menggunakan /bin/sh(tanda hubung) daripada bash, tetapi tanda hubung tidak memiliki <<<.
Gilles 'SANGAT berhenti menjadi jahat'
Terima kasih atas informasi yang bermanfaat!! Ini adalah informasi yang baik untuk diketahui tentang melestarikan sumber daya dan subkulit. Saya sangat menghargai masukan Anda.
shaolin
1
@Gilles hanya membandingkan time for i in {1..10000}; do : <<< ""; donedengan time for i in {1..10000}; do echo "" | : ; done, Anda akan melihat perbedaan dramatis. Maka Anda benar, heredoc sedikit lebih cepat dari herestring. Tetapi lebih canggung untuk mengetik sebagai satu-liner.
gniourf_gniourf
9

Substitusi perintah menyimpan output dari suatu perintah ke dalam variabel.

var3=$(echo "scale=2;$var1/$var2" | bc)
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih! Ini membuat saya tepat di tempat yang saya inginkan, setelah mungkin satu jam meneliti. Terima kasih
shaolin