Làm thế nào để bạn tiếp tục một câu với một lệnh bên trong


12

Ví dụ: tôi đã cố gắng nói "Có 10 người trực tuyến tại thời điểm này" trong tệp tập lệnh của tôi.

Tôi dường như không bao giờ có thể làm cho lệnh hoạt động mà không có phần "mọi người trực tuyến tại thời điểm này" trên dòng tiếp theo.

Hiện tại, tôi có

w='who | wc -l' 
echo "There are $w people online at the moment" 

Tuy nhiên, tôi luôn luôn kết thúc với đầu ra

There are who | wc -l users online at the moment 

Làm thế nào để bạn có được lệnh làm việc ở giữa? Tôi đã cố gắng xem và sao chép các ví dụ, nhưng nó dường như không giúp gì cho vấn đề thay thế lệnh của tôi.

Câu trả lời:


20

Bạn muốn đầu ra của

who | wc -l

được gán cho w, không phải chuỗi đó, đó là những gì bạn nhận được vì các trích dẫn xung quanh nó. Bạn nên sử dụng thay thế lệnh $(...):

w=$(who | wc -l)
echo "There are $w people online at the moment"

(bạn cũng có thể sử dụng các backquote, nhưng bạn không thể dễ dàng lồng chúng).


Trong một số shell, bao gồm Bash, bạn có thể lồng backquote. Nó yêu cầu các lối thoát lồng nhau, xem ví dụ tại stackoverflow.com/a/2657037/776723
ShadSterling

1
@Polyergic Cảm ơn. Tôi đã cập nhật câu trả lời của mình, nhưng tôi nghĩ rằng tôi sẽ gắn bó với $()chính mình ;-)
Anthon

10

Giải pháp khác:

echo There are $(who | wc -l) people online at the moment


5

bạn nên sử dụng backtick để thực thi lệnh

w=`who | wc -l` echo "There are $w people online at the moment"



7
Điểm hợp lệ. "Backtick cũng dễ bị nhầm lẫn với một trích dẫn duy nhất." chính xác những gì đã xảy ra ở đây.
Ghanima

@Ghanima: Thật vậy! Câu hỏi này là một ví dụ tuyệt vời khi chúng ta cần chứng minh tại sao nên tránh backticks. :)
PM 2Ring

Tốt, tôi chỉ nêu lên câu trả lời này vì đó là câu duy nhất giải thích chính xác nơi OP mắc lỗi. Cho dù backticks là tốt hay xấu chỉ là ghi chú bên.
Ruslan
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.