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.

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).


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


5

Anda harus menggunakan backtick untuk menjalankan perintah

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



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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.