วิธีส่งผลลัพธ์ของ bc ไปยังตัวแปร


15

ฉันกำลังเขียนสคริปต์และฉันต้องการส่งผ่านผลลัพธ์bcไปยังตัวแปร ฉันได้ประกาศตัวแปร 2 ตัว ( var1และvar2) แล้วให้ค่าเหล่านั้น ในสคริปต์ของฉันฉันต้องการส่งผลลัพธ์จากbcไปยังตัวแปรอื่นพูดvar3เพื่อให้ฉันสามารถทำงานกับvar3การคำนวณอื่น ๆ ได้ จนถึงตอนนี้ฉันสามารถเขียนผลลัพธ์ไปยังไฟล์ซึ่งไม่ใช่สิ่งที่ฉันกำลังมองหาและนอกจากนี้ฉันสามารถสะท้อนผลลัพธ์ในเทอร์มินัล แต่ฉันต้องการส่งผลลัพธ์ไปยังตัวแปรในขณะนั้น ฉันสามารถทำงานกับตัวแปรนั้นได้

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

คำตอบ:


23

หากคุณกำลังใช้ bash คุณควรใช้สตริงที่นี่แทนไพพ์เช่นเดียวกับใน:

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

สิ่งนี้จะช่วยคุณประหยัดเวลา

จากนั้นเมื่อต้องการเก็บเอาต์พุตของคำสั่งให้ใช้การทดแทนคำสั่ง:

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

แก้ไข

หากคุณต้องการบางสิ่งที่เย็นกว่าbcนี่คือ dc (เครื่องคำนวณขัดย้อนกลับ):

answer=$(dc <<< "2k $var1 $var2/p")

1
ใช่ฉันใช้ทุบตีคุณช่วยอธิบายให้ชัดเจนที่ subshell ได้หรือไม่? มีข้อเสียหรือไม่?
เส้าหลิน

2
ทุกครั้งที่คุณใช้ไพพ์|คำสั่งทางด้านขวาของไพพ์จะถูกดำเนินการใน subshell และใช้ทรัพยากรในการเปิด subshell ใหม่ (มันเหมือนกับการเปิดอินสแตนซ์ใหม่ของ bash เพื่อรันคำสั่งนั้น) หากคุณสามารถหลีกเลี่ยงได้หลีกเลี่ยงได้ ที่นี่ไปป์echoที่bcจะเรียกใช้คำสั่งbcใน subshell และในบางแง่มุมหน่วง (ไม่มีความผิด) เนื่องจากทุบตีมีโครงสร้างสตริงที่นี่ที่ยอดเยี่ยม<<<เพื่อหลีกเลี่ยงสิ่งที่โง่เช่นนี้
gniourf_gniourf

@gniourf_gniourf แล้วอีกครั้งถ้าคุณดูแลเกี่ยวกับการใช้ทรัพยากรที่คุณต้องการใช้/bin/sh(รีบ) แทนทุบตี <<<แต่รีบไม่ได้
Gilles 'หยุดความชั่วร้าย'

ขอบคุณสำหรับข้อมูลที่เป็นประโยชน์ !! นี่เป็นข้อมูลที่ดีที่ควรทราบเกี่ยวกับการอนุรักษ์ทรัพยากรและ subshells ฉันขอขอบคุณที่คุณป้อน
เส้าหลิน

1
@Gilles เพิ่งเปรียบเทียบtime for i in {1..10000}; do : <<< ""; doneกับtime for i in {1..10000}; do echo "" | : ; doneคุณจะเห็นความแตกต่างอย่างมาก ถ้าอย่างนั้นคุณพูดถูก heredoc นั้นเร็วกว่า herestring เล็กน้อย แต่มันน่าอึดอัดใจกว่าที่จะพิมพ์เป็นแบบเส้นเดียว
gniourf_gniourf

9

การทดแทนคำสั่งจะเก็บเอาต์พุตของคำสั่งลงในตัวแปร

var3=$(echo "scale=2;$var1/$var2" | bc)

ขอขอบคุณ! สิ่งนี้ทำให้ฉันได้อย่างแม่นยำในที่ที่ฉันต้องการหลังจากหนึ่งชั่วโมงของการค้นคว้า ขอบคุณ
เส้าหลิน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.