Wie setzt man einen Satz mit einem Befehl fort?

12

Ich habe zum Beispiel versucht, in meiner Skriptdatei zu sagen, dass zurzeit 10 Personen online sind.

Ich kann den Befehl scheinbar nie zum Laufen bringen, ohne den Teil "Leute online im Moment" in der nächsten Zeile.

Im Moment habe ich

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

Allerdings lande ich immer mit der Ausgabe

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

Wie bekommt man den Befehl in der Mitte zum Laufen? Ich habe versucht, Beispiele zu suchen und zu kopieren, aber es scheint meinem Problem mit der Befehlsersetzung nicht zu helfen.

techiegeek
quelle

Antworten:

20

Sie möchten die Ausgabe von

who | wc -l

zugewiesen w, nicht diese Zeichenfolge, die Sie aufgrund der Anführungszeichen um ihn erhalten. Sie sollten die Befehlssubstitution verwenden $(...):

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

(Sie können auch die Anführungszeichen verwenden, aber Sie können diese nicht einfach verschachteln).

Anthon
quelle
In einigen Shells, einschließlich Bash, können Sie Backquotes verschachteln. Es erfordert geschachtelte Escapezeichen
ShadSterling,
1
@Polyergic Danke. Ich habe meine Antwort aktualisiert, aber ich denke, ich bleibe beim Schachteln $();-)
Anthon
10

Eine andere Lösung:

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

Sree
quelle
5

Sie sollten backtick verwenden, um den Befehl auszuführen

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

Sicherheitstier
quelle
14
Sehen Sie, warum $(...)Backticks vorgezogen wird ...
Jasonwryan
7
Gutes Argument. "Das Backtick ist auch leicht mit einem einfachen Anführungszeichen zu verwechseln." genau das, was hier passiert ist.
Ghanima
@ Ghana: In der Tat! Diese Frage ist ein gutes Beispiel dafür, warum Backticks vermieden werden sollten. :)
PM 2Ring
Gut, ich habe nur diese Antwort positiv bewertet, weil es die einzige ist, die genau erklärt, wo der OP den Fehler hatte. Ob Backticks gut oder böse sind, sind nur Randnotizen.
Ruslan