Como você continua uma frase com um comando dentro

12

Por exemplo, tenho tentado dizer "Há 10 pessoas on-line no momento" no meu arquivo de script.

Parece que nunca consigo executar o comando sem a parte "pessoas on-line no momento" na próxima linha.

No momento, eu tenho

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

No entanto, eu sempre acabo com a saída

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

Como você obtém o comando trabalhando no meio? Eu tenho tentado procurar e copiar exemplos, mas não parece ajudar no meu problema de substituição de comando.

techiegeek
fonte

Respostas:

20

Você quer a saída de

who | wc -l

atribuído a w, e não a string, que é o que você recebe por causa das aspas ao redor. Você deve usar a substituição de comando $(...):

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

(você também pode usar as aspas anteriores, mas não pode aninhar facilmente).

Anthon
fonte
Em algumas conchas, incluindo o Bash, você pode aninhar aspas posteriores. Requer escapes aninhados, veja o exemplo em stackoverflow.com/a/2657037/776723
ShadSterling
1
@ Agradecimentos Polyergic. Eu atualizei minha resposta, mas acho que vou continuar $()me aninhando ;-) #
Anthon
10

Outra solução:

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

Sree
fonte
5

você deve usar backtick para executar o comando

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

Besta de Segurança
fonte
14
Veja por que $(...)é preferido sobre backticks ...
jasonwryan
7
Ponto válido. "O backtick também é facilmente confundido com uma única citação". exatamente o que aconteceu aqui.
Ghanima 12/12
@Ghanima: De fato! Esta pergunta é um ótimo exemplo de quando precisamos demonstrar por que os backticks devem ser evitados. :)
PM 2Ring
Bom, votei apenas esta resposta porque é a única que explica exatamente onde o OP cometeu o erro. Se os backticks são bons ou maus, são apenas notas secundárias.
Ruslan