Jaka jest różnica między grep apple file
i grep "apple" file
? Co robi wstawianie cudzysłowów? Wydaje się, że oba działają i robią dokładnie to samo (wyświetlają tę samą linię).
22
Cudzysłowy mają wpływ na to, jakie znaki twoja powłoka uważa za specjalne i mają znaczenie składniowe. W twoim przykładzie nie robi to różnicy, ponieważ apple
nie zawiera takich znaków.
Ale rozważ inny przykład: grep apple tree file
wyszuka słowo apple
w plikach tree
i file
, podczas gdy grep "apple tree" file
przeszuka słowo apple tree
w pliku file
. Znaki cudzysłowu informują bash, że słowo spacja "apple tree"
nie rozpoczyna nowego parametru, ale powinno być częścią bieżącego parametru. grep apple\ tree file
dałoby ten sam wynik, ponieważ \
każe bashowi zignorować specjalne znaczenie poniższego znaku i traktować go dosłownie.
grep a*b equations.txt
, będzie szukała*b
, chyba że w bieżącym katalogu znajduje się plik zaczynający się od a, kończący się na b, w którym to przypadku (ponieważ (ba) sh rozwinie nazwy plików w wierszu poleceń) grep zostanie wywołany z wypełnić różne parametry, co daje różne wyniki. Zwykle jest to większy problem z find, ponieważ takie poleceniefind . -name *.txt
spowoduje nieoczekiwane zachowanie, jeśli w bieżącym katalogu znajduje się plik txt. W takim przypadku lepiej użyć cudzysłowów."
) i pojedynczymi cudzysłowami ('
). Pojedyncze cudzysłowy uniemożliwiają interpretację niektórych znaków, np.$
Podwójne cudzysłowy umożliwiają interpretację. Np. Wyszukagrep '${USER}'
tekst${USER}
, podczas gdygrep "${USER}"
wyszuka tekst, któryUSER
zawiera zmienna (npjohnstacen
.).Podwójne cudzysłowy pozwalają na ocenę, pojedyncze cudzysłowy uniemożliwiają ocenę, brak cudzysłowu pozwala na interpretację symboli wieloznacznych, gdy są używane w wierszu poleceń. Jako wymyślone przykłady:
Zrozumienie sposobu działania cytatów jest kluczowe dla zrozumienia Bash. Na przykład:
Możesz użyć pojedynczych cudzysłowów, aby przekazać polecenie przez zmienną. Pojedyncze cytaty zapobiegną ocenie. Podwójne cytaty zostaną ocenione.
Możesz używać pojedynczych cudzysłowów wewnątrz podwójnych cudzysłowów i możesz używać podwójnych cudzysłowów wewnątrz podwójnych cudzysłowów, ale podwójne cudzysłowy wewnątrz pojedynczych cudzysłowów
nie powinny być wykonywane (bez ich ucieczki)nie będą oceniane, będą interpretowane dosłownie. Pojedyncze cytaty w pojedynczych cudzysłowach nie powinny być wykonywane (bez ich ucieczki).Musisz dokładnie zrozumieć cytaty, aby skutecznie korzystać z Bash. Bardzo ważne!
Zasadniczo nie używam cudzysłowów, jeśli chcę, aby Bash rozwinął coś do elementów (takich jak tablica), używam pojedynczych cudzysłowów dla dosłownych ciągów znaków, których nie należy zmieniać, i swobodnie używam podwójnych cudzysłowów dla zmiennych które prawdopodobnie zwrócą dowolny typ ciągu. Ma to na celu zachowanie spacji i znaków specjalnych.
źródło