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.