Jak kontynuować zdanie z poleceniem w środku

12

Na przykład w moim pliku skryptu próbowałem powiedzieć „W tej chwili jest 10 osób online”.

Nigdy nie wydaje mi się, aby polecenie działało bez części „ludzie online w tej chwili” w następnym wierszu.

W tej chwili mam

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

Zawsze jednak kończę na wynikach

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

Jak sprawić, by polecenie działało w środku? Próbowałem szukać i kopiować przykłady, ale wydaje się, że to nie pomaga w rozwiązaniu problemu z zastępowaniem poleceń.

techiegeek
źródło

Odpowiedzi:

20

Chcesz wynik

who | wc -l

przypisany do w, a nie tego ciągu, co dostajesz ze względu na otaczające go cudzysłowy. Powinieneś użyć podstawiania poleceń $(...):

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

(możesz także użyć cudzysłowów, ale nie możesz ich łatwo zagnieździć).

Anthon
źródło
W niektórych powłokach, w tym w Bash, możesz zagnieżdżać cudzysłowy. Wymaga zagnieżdżonych ucieczek, patrz przykład na stackoverflow.com/a/2657037/776723
ShadSterling,
1
@Polyergic Thanks. Zaktualizowałem swoją odpowiedź, ale myślę, że będę się trzymać zagnieżdżania $();-)
Anthon
10

Inne rozwiązanie:

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

Sree
źródło
5

powinieneś użyć backsticka, aby wykonać polecenie

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

Security Beast
źródło
14
Zobacz, dlaczego $(...)preferuje się
backtyki
7
Ważny punkt „Cofnięcie można łatwo pomylić z jednym cytatem”. dokładnie to, co się tutaj stało.
Ghanima,
@Ghanima: Rzeczywiście! To pytanie jest doskonałym przykładem na to, kiedy musimy wykazać, dlaczego należy unikać nawrotów. :)
PM 2Ring
Dobrze, głosowałem tylko tę odpowiedź, ponieważ jest to jedyna, która dokładnie wyjaśniła, gdzie OP popełnił błąd. Niezależnie od tego, czy backty są dobre, czy złe, to tylko dodatkowe uwagi.
Ruslan