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.

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


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


5

Sie sollten backtick verwenden, um den Befehl auszuführen

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


14

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.