Comment continuez-vous une phrase avec une commande à l'intérieur

12

Par exemple, j'ai essayé de dire "Il y a 10 personnes en ligne en ce moment" dans mon fichier de script.

Je n'arrive jamais à faire fonctionner la commande sans la partie "personnes en ligne en ce moment" sur la ligne suivante.

En ce moment, j'ai

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

Cependant, je me retrouve toujours avec la sortie

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

Comment obtenez-vous la commande qui fonctionne au milieu? J'ai essayé de chercher et de copier des exemples, mais cela ne semble pas aider mon problème de substitution de commande.

techiegeek
la source

Réponses:

20

Vous voulez la sortie de

who | wc -l

assigné à w, pas cette chaîne, qui est ce que vous obtenez en raison des guillemets qui l'entourent. Vous devez utiliser la substitution de commande $(...):

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

(vous pouvez également utiliser les guillemets, mais vous ne pouvez pas facilement les imbriquer).

Anthon
la source
Dans certains coquillages, dont Bash, vous pouvez imbriquer des guillemets. Il nécessite des échappements imbriqués, voir l'exemple sur stackoverflow.com/a/2657037/776723
ShadSterling
1
@Merci polyergique. J'ai mis à jour ma réponse, mais je pense que je vais m'en tenir à $()moi-même ;-)
Anthon
10

Une autre solution:

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

Sree
la source
5

vous devez utiliser backtick pour exécuter la commande

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

Bête de sécurité
la source
14
Voyez pourquoi $(...)est préféré aux backticks ...
jasonwryan
7
Point valide. "Le backtick est également facilement confondu avec une seule citation." exactement ce qui s'est passé ici.
Ghanima
@Ghanima: En effet! Cette question est un excellent exemple lorsque nous devons démontrer pourquoi les contre-coups devraient être évités. :)
PM 2Ring
Bon, je n'ai voté que cette réponse parce que c'est la seule qui expliquait exactement le PO avait commis l'erreur. Que les contre-coups soient bons ou mauvais ne sont que des notes annexes.
Ruslan