Podczas szukania prostego wzorca „witaj” w pliku działają wszystkie następujące formy grep:
- plik grep hello 1
- plik grep 'hello' 1
- plik grep „hello” 1
Czy istnieje konkretny przypadek, w którym jedna z powyższych form działa, a inne nie. Czy robi to jakąkolwiek różnicę, jeśli używam jednego zamiast drugiego?
$
jest końcem wiersza w wyrażeniu regularnym, więc$VAR1
nigdy nie powinien właściwie pasować do niczego. Zdarza się, że działa na GNU grep, ale nadal nie liczyłbym na takie zachowanie. Musisz\$VAR1
bezpiecznie dopasować dosłowny ciąg. (A ty potrzebować dodatkowych backslashy, czy to w cudzysłów.)James ma rację, ale aby dodać trochę więcej danych, myślę, że najlepszym sposobem myślenia o tym są argumenty polecenia: czy zamierzasz „cześć” i „świat” być dwoma argumentami, czy „cześć światem” być jednym argument.
Również podwójne cudzysłowy pozwalają interpretować coś więcej niż tylko zmienne. Dokładnie to, co zależy od powłoki, ale sprawdź ekspansję historii, nawias klamrowy i rozszerzenie nazwy pliku.
Ważne jest również, aby pamiętać, że istnieją przypadki, w których trzeba użyć obu typów cudzysłowów w jednym argumencie. Pamiętaj, że (domyślnie) argumenty są rozdzielane białymi spacjami, więc jeśli nie zostawisz miejsca, nadal podajesz ten sam argument.
Mechanizm pojedynczego cudzysłowu większości powłok nie dopuszcza żadnych znaków specjalnych, co oznacza, że każde wystąpienie innego pojedynczego cudzysłowu, nawet jeśli wydaje się, że jest poprzedzone, kończy cytat. Dlatego nie jest możliwe przekazanie ciągu z pojedynczym cytatem w ciągu pojedynczego cudzysłowu i konieczne jest użycie podwójnych cudzysłowów. Może to być kłopotliwe, gdy chcesz przekazać argument zawierający pojedyncze cudzysłowy i coś, co można interpretować, ale nie chcesz. Na przykład, jeśli chcesz przekazać ciąg literalny „$ VAR” jest zmienną ”, musisz to zrobić w ten sposób:
To właściwie połączenie trzech ciągów znaków bez cudzysłowu:
lub, po usunięciu cytatów:
W rzeczywistości w przypadku większości powłok można to zrobić w ten sposób:
gdzie ukośnik odwrotny („
\
”) mówi powłoce, aby dosłownie zaakceptowała następujący znak i nie dokonywała na nim żadnego rozwinięcia.Ale są pewne przypadki, w których kończy się to na łączeniu wielu strun, nie żebym w tej chwili mógł podać przykład.
źródło