Śledzę ten przewodnik skryptowania powłoki bash:
W sekcji Porównania numeryczne przytacza przykład:
anny > num=`wc -l work.txt`
anny > echo $num
201
anny > if [ "$num" -gt "150" ]
More input> then echo ; echo "you've worked hard enough for today."
More input> echo ; fi
Wydaje się, że tak się dzieje powyżej: przechowujemy ciąg poleceń w zmiennej bash, a następnie wywołujemy echo zmiennej. Wydaje się, że tak się dzieje, że łańcuch jest analizowany i wykonywana jest komenda wc i zwraca liczbę linii do terminala sterującego.
Ok, więc uruchamiam mój terminal w Ubuntu 12.04 i próbuję czegoś podobnego:
$ touch sample.txt && echo "Hello World" > sample.txt
$ cat sample.txt
Hello World
$ num='wc -l sample.txt'
echo $num
wc -l sample.txt
Poczekaj chwilkę, która nie oceniła ciągu i zwróciła liczbę wierszy. To tylko powtórzyło ciąg z powrotem do terminala. Dlaczego otrzymałem różne wyniki?
command-line
bash
scripts
JohnMerlino
źródło
źródło
wc -l work.txt
, zamiast tego przypisywany jest numer 201.Odpowiedzi:
Aby ocenić wyrażenie, musisz użyć odwrotnych klawiszy.
Jeśli chcesz zobaczyć tylko „1” na wyjściu, użyj polecenia
A także działa:
Aby uzyskać dodatkowe informacje, zobacz Różnice między podwójnymi cudzysłowami „”, pojedynczymi cudzysłowami ”i odwrotnymi wierszami„ ”w wierszu poleceń?
źródło
wc
działa polecenie. Spróbowaćcat sample.txt | wc -l
.Uwaga: ten symbol:
Pojedynczy cytat
i
Backquote
Więc Backquote zwraca wynik polecenia na Standard Output. Dlatego
zwraca wyniki polecenia, natomiast
po prostu zwróć „wc -l sample.txt” jak zwykle
Rozważ zrobienie tego jako przykładu:
A teraz echo wszystkich trzech zmiennych:
źródło
Jeśli chcesz przechwycić dane wyjściowe polecenia w zmiennej, musisz użyć odwrotnego ciągu
``
lub dołączyć polecenie w$()
:Zauważ, że łańcuch jest faktycznie oceniany w momencie deklaracji zmiennej, a nie po jego powtórzeniu. Komenda jest w rzeczywistości uruchamiana w obrębie
$()
lub za pomocą tyknięć, a wynik tej komendy jest zapisywany jako wartość zmiennej.Ogólnie rzecz biorąc, zawsze powinieneś używać
$()
zamiast backticków, które są przestarzałe i tylko ze względów kompatybilności i znacznie bardziej ograniczone. Nie możesz na przykład zagnieżdżać poleceń w ramach backticksa, ale możesz$()
:Zobacz ten wątek na stronie U&L, aby dowiedzieć się więcej o tym, dlaczego
``
należy tego unikać.źródło
$(
)
do`
`
. Ale jak mówi wag , cytaty tylne się zagnieżdżają.echo $(date -d $(echo yesterday))
staje sięecho `date -d \`echo yesterday\``
;echo $(echo $(date -d $(echo yesterday)))
staje sięecho `echo \`date -d \\\`echo yesterday\\\`\``
. Mówię, że to nie obala twojej tezy, ale ją wzmocni : uniknięte wewnętrzne cudzysłowy sprawiają, że`
`
składnia jest silniejsza niż często się przyznaje, ale specjalne traktowanie\
jest dziwne, zaskakujące i trudne do uzasadnienia. Z$(
)
tego, co można zobaczyć jest zwykle to, co dostajesz.