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

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


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


5

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

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.