Bagaimana Anda melanjutkan kalimat dengan perintah di dalamnya

12

Sebagai contoh, saya telah mencoba mengatakan "Ada 10 orang online saat ini" di file skrip saya.

Saya sepertinya tidak pernah bisa mendapatkan perintah yang berfungsi tanpa bagian "orang-orang online saat ini" di baris berikutnya.

Saat ini, saya punya

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

Namun, saya selalu berakhir dengan output

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

Bagaimana Anda membuat perintah bekerja di tengah? Saya sudah mencoba melihat dan menyalin contoh, tetapi sepertinya tidak membantu masalah substitusi perintah saya.

techiegeek
sumber

Jawaban:

20

Anda ingin output dari

who | wc -l

ditugaskan untuk w, bukan string itu, yang adalah apa yang Anda dapatkan karena tanda kutip di sekitarnya. Anda harus menggunakan substitusi perintah $(...):

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

(Anda juga dapat menggunakan backquotes, tetapi Anda tidak dapat dengan mudah menyarangkannya).

Anthon
sumber
Di beberapa shell, termasuk Bash, Anda dapat membuat backquotes. Itu membutuhkan pelarian bersarang, lihat contoh di stackoverflow.com/a/2657037/776723
ShadSterling
1
@Polyergic Terima kasih. Saya memperbarui jawaban saya, tetapi saya pikir saya akan tetap bersarang $()sendiri ;-)
Anthon
10

Solusi lain:

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

Sree
sumber
5

Anda harus menggunakan backtick untuk menjalankan perintah

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

Binatang Keamanan
sumber
14
Lihat mengapa $(...)lebih disukai daripada backticks ...
jasonwryan
7
Poin yang valid. "Backtick juga mudah dikacaukan dengan satu kutipan." persis apa yang terjadi di sini.
Ghanima
@Hanima: Memang! Pertanyaan ini adalah contoh yang bagus ketika kita perlu menunjukkan mengapa backticks harus dihindari. :)
PM 2Ring
Bagus, saya hanya memilih jawaban ini karena itu satu-satunya yang menjelaskan dengan tepat di mana OP memiliki kesalahan. Apakah backtick itu baik atau jahat hanyalah catatan.
Ruslan