Jaka jest różnica między pojedynczymi i podwójnymi notowaniami w powłoce Bash?
Umieszczanie tekstu w cudzysłowach jest dość standardową praktyką w linii poleceń, szczególnie w przypadku plików zawierających spacje w nazwach, ale skąd wiadomo, czy używać pojedynczych czy podwójnych cudzysłowów? Rzućmy okiem na różnicę i kiedy powinieneś użyć jednego z drugim.
Ogólna zasada mówi, że podwójne cudzysłowy wciąż umożliwiają ekspansję zmiennych w obrębie kwotowań, a pojedyncze cudzysłowy nie. Czytaj dalej.
Cytaty z prostym tekstem
Jeśli po prostu zamykasz kilka słów tekstu, to naprawdę nie ma znaczenia, którego z nich używasz, ponieważ oba będą działać dokładnie tak samo. Na przykład te dwie komendy utworzą katalog o nazwie Katalog testowy:
mkdir "Katalog testowy"
mkdir "Katalog testowy"
Bardziej doświadczeni użytkownicy zapewne zauważą, że możesz również użyć katalogu testowego mkdir, jeśli chcesz.
Zmienna zmienna Shell
Różnica między pojedynczym a podwójnym cudzysłowem staje się ważniejsza, gdy mamy do czynienia ze zmiennymi w linii poleceń - domyślnie bash rozszerzy zmienną, taką jak $ test, na cały ciąg znaków. Najpierw przypiszemy zmienną:
test = "To jest test"
Teraz możesz użyć tej zmiennej w linii poleceń, tak jak ta, która powinna po prostu wyprowadzać To jest test do konsoli:
test echo $
Oto, gdzie różnica pomiędzy podwójnym i pojedynczym cudzysłowem staje się bardziej wyraźna - kiedy używasz pojedynczych cudzysłowów, zmienne nie będą rozwijane. Na przykład, jeśli uruchomisz to polecenie:
echo "$ test"
Podczas korzystania z pojedynczych cudzysłowów nie zobaczysz nic prócz "$ test" w wierszu poleceń, ale będzie on poprawnie wyświetlał się podczas używania podwójnych cudzysłowów:
To samo działa, gdy używasz znaku, aby rozwinąć polecenie w linii poleceń. Na przykład powiedz, że chciałeś użyć pwd polecenie z poziomu innego polecenia - użyjesz odsunięć, aby powiedzieć powłoce, aby ją rozwinąć:
echo "pwd" / test
Jeśli byłeś w folderze domowym, zobaczysz dane wyjściowe, które wyglądają tak:
/ home / geek / test
Powiedzmy na przykład, że znajdujesz się w folderze, który ma spację w ścieżce i chcesz użyć polecenia ln, aby utworzyć dowiązanie symboliczne do pliku w bieżącym katalogu. Zwykle musisz podać pełną ścieżkę przy użyciu polecenia ln, więc znacznie łatwiej jest użyć "pwd", aby zapisać wpisywanie.
Zobacz, co się stanie, gdy spróbujesz użyć komendy bez zamykania w cudzysłowach:
ln -s 'pwd' / test / home / geek / linkedname
Zamiast tego musisz otoczyć w cudzysłowach:
ln -s "" pwd "/ filename" / some / other / path
Aby uzyskać bardziej konkretny przykład, załóżmy, że mamy strukturę folderów podobną do tego przykładu, w której wszystkie nazwy plików zawierają spacje:
Ponieważ polecenie "unzip" nie obsługuje używania * w celu uruchomienia go dla wszystkich plików, należy zamiast tego użyć polecenia for. Oto, gdzie rzeczy stają się interesujące:
dla f w * .zip; wykonaj rozpakuj $ f; gotowe
Ups! Wygląda na to, że to nie zadziałało.
Zamiast tego będziemy musieli użyć podwójnych cudzysłowów wokół zmiennej $ f, jak poniżej:
dla f in * .zip; rozpakuj "$ f"; gotowe
Teraz za każdym razem, gdy polecenie for przechodzi przez pętlę, uruchomi komendę podobną do tej:
rozpakuj "test 1.zip"
Oczywiście przełączy się i uruchomi podobne polecenie dla każdego pliku w katalogu.
Przejrzyjmy
Teraz, gdy przejrzeliśmy przykłady, szybko sprawdzimy, czy to przegapiłeś:
Podwójne cytaty
- Użyj, gdy chcesz dołączyć zmienne lub użyć rozszerzenia powłoki w ciągu znaków.
- Wszystkie znaki w obrębie są interpretowane jako zwykłe znaki z wyjątkiem $ lub ", które zostaną rozwinięte w powłoce.
Pojedyncze cytaty
- Wszystkie znaki w pojedynczym cudzysłowie są interpretowane jako ciąg znaków.
I tak kończy się lekcja cytatów. Używaj ich mądrze.