Câu hỏi bash shell script thêm đầu ra của lệnh


Giả sử tôi có một lệnh gọi là foo in một số vào màn hình khi được gọi:

$ foo
3

Hãy nói rằng tôi có một lệnh khác gọi là bar in một số khác vào màn hình khi được gọi:

$ bar
5

Tôi đang tìm cách viết một kịch bản lệnh shell mà sẽ cộng một cách tổng hợp đầu ra của foo và bar (3 + 5 = 8). Tôi sẽ làm như thế nào? (Các kết quả đầu ra từ các lệnh không được biết trước. Chúng chỉ xảy ra là 3 và 5 lần cuối cùng chúng chạy. Chúng có thể là thứ khác.)


4
2018-04-22 17:22


gốc


Những gì bạn có nghĩa là bằng cách thêm với nhau? Là chương trình đầu ra luôn luôn số nguyên và bạn muốn 3 + 5 = 8 hoặc là họ dây và bạn muốn '3' + '5' = '35'. - Benjamin Bannier
chúng là số nguyên và tôi đang tìm cách thêm chúng (3 + 5 = 8), không nối chúng - John Kube


Các câu trả lời:


Sử dụng bash's let để đánh giá các biểu thức số học.

#!/bin/bash
a=`echo 3`
b=`echo 5`

let c=$a+$b
echo $c

Chỉ cần thay thế các cuộc gọi đến echo với các cuộc gọi chương trình của bạn.


8
2018-04-22 17:39



Bạn có thể bỏ qua các dấu đô la trong một let tuyên bố. - Dennis Williamson
@ Dennis: Tôi biết, nhưng theo cách này thì ít nhất hình như thích hợp. Cách ngắn nhất (đáng buồn?) Thường có nhiều khả năng gây nhầm lẫn nhất (xem Perl;) - Benjamin Bannier
let là ma quỷ. Nó cảm thấy như BASIC, và làm cho gấu trúc con khóc. Cơ chế paren đôi không gây hại cho gấu trúc. ;) - dannysauer


Một thay thế cho let là sử dụng cú pháp ngoặc kép:

(( c = $(foo) + $(bar) ))

hoặc là

echo $(( $(foo) + $(bar) ))

hoặc sử dụng các biến, bạn có thể bỏ qua ký hiệu đô la ở phía bên tay phải của bằng:

(( c += $(foo) + num ))

(cũng minh họa một bài tập gia tăng)

Nếu bạn đang sử dụng các số nguyên không, bạn có thể sử dụng bc:

echo "$(foo) + $(bar)" | bc

hoặc là

c=$(echo "$(foo) + $(bar)" | bc)

Một lợi thế của việc sử dụng dấu ngoặc kép là bạn có thể đặt khoảng trống xung quanh toán hạng và toán tử để làm cho mọi thứ dễ đọc hơn:

(( c = ( a + b ) * ( i - j ) ))

3
2018-04-22 18:19





bash:

bc < <({ foo ; echo + ; bar ; } | tr '\n' ' ' ; echo)

Nếu đầu ra chỉ là số nguyên:

$(( $(foo) + $(bar) ))

1
2018-04-22 17:39