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


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 

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

Ответы:


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


5

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

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


14
Посмотрите, почему $(...)предпочтительнее, чем backticks ...
Jasonwryan

7
Действительная точка. «Обратный удар также легко спутать с одинарной кавычкой». именно то, что здесь произошло.
Ганима

@ Ганима: Действительно! Этот вопрос является отличным примером того, когда нам нужно продемонстрировать, почему следует избегать обратных кавычек. :)
PM 2Ring 12.12.14

Хорошо, я проголосовал только за этот ответ, потому что он единственный, который объяснил, где именно у ОП была ошибка. Являются ли спины хорошими или злыми, являются лишь побочными нотами.
Руслан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.