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.

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


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


5

vous devez utiliser backtick pour exécuter la commande

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



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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.