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

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


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


5

debe usar la tecla de retroceso para ejecutar el comando

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



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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.