Как вы продолжите предложение с командой внутри

12

Например, я пытался сказать «В данный момент в сети 10 человек».

Кажется, я никогда не смогу заставить команду работать без части "люди онлайн сейчас" на следующей строке.

На данный момент у меня есть

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

Тем не менее, я всегда в конечном итоге с выходом

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

Как вы получаете команду, работающую в середине? Я пытался искать и копировать примеры, но это, похоже, не помогает моей проблеме подстановки команд.

techiegeek
источник

Ответы:

20

Вы хотите вывод

who | wc -l

присваивается w, а не та строка, которую вы получаете из-за кавычек вокруг нее. Вы должны использовать подстановку команд $(...):

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

(вы также можете использовать обратные кавычки, но вы не можете легко их вставить).

Энтон
источник
В некоторых оболочках, включая Bash, вы можете вкладывать обратные кавычки.
Требуются вложенные escape-коды
1
@Polyergic Спасибо. Я обновил свой ответ, но я думаю, что буду придерживаться вложенности $()себя ;-)
Anthon
10

Другое решение:

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

Sree
источник
5

Вы должны использовать backtick для выполнения команды

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

Зверь безопасности
источник
14
Посмотрите, почему $(...)предпочтительнее, чем backticks ...
Jasonwryan
7
Действительная точка. «Обратный удар также легко спутать с одинарной кавычкой». именно то, что здесь произошло.
Ганима
@ Ганима: Действительно! Этот вопрос является отличным примером того, когда нам нужно продемонстрировать, почему следует избегать обратных кавычек. :)
PM 2Ring 12.12.14
Хорошо, я проголосовал только за этот ответ, потому что он единственный, который объяснил, где именно у ОП была ошибка. Являются ли спины хорошими или злыми, являются лишь побочными нотами.
Руслан