Làm thế nào để chuyển kết quả của bc cho một biến


15

Tôi đang viết một kịch bản và tôi muốn chuyển kết quả từ bcmột biến. Tôi đã khai báo 2 biến ( var1var2) và đã cho chúng các giá trị. Trong kịch bản của tôi, tôi muốn chuyển các kết quả từ bcmột biến khác var3để tôi có thể làm việc với var3các tính toán khác. Cho đến nay tôi đã có thể ghi kết quả vào một tệp không phải là thứ tôi đang tìm và tôi cũng có thể lặp lại kết quả trong thiết bị đầu cuối nhưng tôi chỉ muốn chuyển kết quả cho một biến vào lúc này để Tôi có thể làm việc với biến đó.

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

Câu trả lời:


23

Nếu bạn đang sử dụng bash, tốt hơn bạn nên sử dụng chuỗi ở đây thay vì đường ống như trong:

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

Điều này sẽ giúp bạn tiết kiệm một subshell.

Sau đó, để lưu trữ đầu ra của lệnh, sử dụng thay thế lệnh:

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

Biên tập.

Nếu bạn muốn một cái gì đó thậm chí mát hơn bc, đây là dc (máy tính đánh bóng ngược):

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

1
Có, tôi đang sử dụng bash, bạn có thể vui lòng làm rõ trên subshell không? Có bất lợi không?
shaolin

2
Mỗi khi bạn sử dụng một đường ống |, lệnh bên phải của đường ống được thực thi trong một khung con và cần có tài nguyên để mở một mạng con mới (nó giống như mở một trường hợp bash mới để thực hiện lệnh đó). Nếu bạn có thể tránh nó, hãy tránh nó. Ở đây, đường ống một echođến bcsẽ chạy lệnh bctrong một subshell và, trong một nghĩa nào đó, làm chậm (không có vi phạm), vì bash có tuyệt vời ở đây-string xây dựng <<<để tránh những điều ngu ngốc như thế này.
gniourf_gniourf

@gniourf_gniourf Sau đó, một lần nữa, nếu bạn quan tâm đến việc sử dụng tài nguyên, bạn sẽ sử dụng /bin/sh(dấu gạch ngang) thay vì bash, nhưng dấu gạch ngang không có <<<.
Gilles 'SO- ngừng trở nên xấu xa'

Cảm ơn bạn đã thông tin hữu ích !! Đây là thông tin tốt để biết về việc bảo tồn tài nguyên và các mạng con. Tôi đánh giá rất cao bạn đầu vào.
shaolin

1
@Gilles chỉ cần so sánh time for i in {1..10000}; do : <<< ""; donevới time for i in {1..10000}; do echo "" | : ; done, bạn sẽ thấy một sự khác biệt lớn. Vậy thì bạn đã đúng, một di sản nhanh hơn một chút so với di truyền. Nhưng nó khó xử hơn khi gõ như một lớp lót.
gniourf_gniourf

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.