¿Cómo continúas una oración con un comando adentro?

12

Por ejemplo, he estado tratando de decir "Hay 10 personas en línea en este momento" en mi archivo de script.

Parece que nunca puedo hacer que el comando funcione sin la parte de "personas en línea en este momento" en la línea siguiente.

Por el momento, tengo

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

Sin embargo, siempre termino con la salida

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

¿Cómo haces que el comando funcione en el medio? He estado tratando de buscar y copiar ejemplos, pero no parece ayudar a mi problema de sustitución de comandos.

techiegeek
fuente

Respuestas:

20

Quieres la salida de

who | wc -l

asignado a w, no esa cadena, que es lo que obtienes debido a las comillas a su alrededor. Debe usar la sustitución de comandos $(...):

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

(también puede usar las comillas inversas, pero no puede anidarlas fácilmente).

Anthon
fuente
En algunos shells, incluido Bash, puede anidar comillas inversas. Requiere escapes anidados, consulte el ejemplo en stackoverflow.com/a/2657037/776723
ShadSterling
1
@Polyergic Gracias. Actualicé mi respuesta, pero creo que seguiré anidando $();-)
Anthon
10

Otra solución:

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

Sree
fuente
5

debe usar la tecla de retroceso para ejecutar el comando

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

Bestia de seguridad
fuente
14
Vea por qué $(...)se prefiere a los backticks ...
jasonwryan
77
Punto valido. "El backtick también se confunde fácilmente con una sola cita". exactamente lo que pasó aquí.
Ghanima
@Ghanima: ¡De hecho! Esta pregunta es un gran ejemplo para cuando necesitamos demostrar por qué se deben evitar los backticks. :)
PM 2Ring
Bien, he votado solo esta respuesta porque es la única que explicó exactamente dónde se cometió el error. Si los backticks son buenos o malos son solo notas al margen.
Ruslan