Różnice między podwójnymi cudzysłowami „”, pojedynczymi cudzysłowami i odwrotnymi wierszami „w wierszu poleceń?

43

Często widzę tutoriale w Internecie lub posty na tej stronie, które często wykorzystują następujące znaki w wierszu poleceń. Często wydaje się, że są one wykorzystywane do dość podobnych celów. Jakie są między nimi różnice, gdy są używane w wierszu poleceń lub do programowania powłoki? W jakim celu wykorzystam który z nich?

" " double quotes

' ' single quotes

` ` backticks
NES
źródło

Odpowiedzi:

43

Dla przykładu rozważmy, że zmienna foozawiera uname( foo=uname).

  • echo "$foo"wyniki uname, podstawiając zmienne w tekście.
    • Aby uzyskać dosłowny $znak w "cudzysłowie, użyj \$; dosłownie "użyj \".
  • echo '$foo'wyjścia $foo, dokładny ciąg.
    • Nawet 'nie da się uciec jak \'wewnątrz 'cytatów. Ale możesz użyć 'foo'\''bar'.
  • echo `$foo`generuje Linux, wykonując zawartość zmiennej i echodrukując ją.
shellholic
źródło
\jest zawsze traktowany dosłownie, gdy jest ujęty w pojedyncze cytaty, nawet jeśli poprzedza on '. Po otwarciu 'następny 'jest zawsze interpretowany jako cytat zamykający. Coś w rodzaju cytowania 'w ciągu pojedynczego cudzysłowu można osiągnąć, kończąc cytowanie, unikając 'pojedynczych znaków i ponownie rozpoczynając cytowanie. Oznacza to, że chociaż \'nie działa między otwierającymi i zamykającymi 'postaciami, '\''działa. (Patrz Gilles „s korekta do jednego z moich postów, gdy ja popełnili ten sam błąd o szczegóły.)
Eliah Kagan
11

Jest to bardzo ładnie wyjaśnione w odpowiedniej sekcji podręcznika bash. W skrócie, wszystko w obrębie pojedynczych cytatów jest interpretowane dosłownie. Na przykład:

$ echo '$SHELL'
$SHELL
$ echo '{1..3}'
{1..3}

Porównaj to z wersjami nie cytowanymi:

$ echo $SHELL
/bin/bash
$ echo {1..3}
1 2 3

Podwójne cudzysłowy pozwalają na zmienną ekspansję (także ekspansję historii i kilka innych rzeczy). Zasadniczo używasz ich, gdy masz do czynienia z czymś, co chcesz rozszerzyć. Na przykład:

$ echo "$SHELL"
/bin/bash
$ echo "!!"
echo "echo "$SHELL""
echo /bin/bash

Innymi słowy, pojedyncze cudzysłowy całkowicie chronią ciąg przed powłoką, podczas gdy podwójne cudzysłowy chronią niektóre rzeczy (na przykład spacje), ale umożliwiają prawidłowe interpretowanie / interpretowanie zmiennych i znaków specjalnych.

terdon
źródło
1
nie jestem pewien, czy OP został zmieniony po fakcie, ale ta odpowiedź nie wspomina o backticksach?
Alexander Mills,
5

Pojedyncze cudzysłowy ( '') służą do zachowania literalnej wartości każdego znaku zawartego w cudzysłowach.

Używając podwójnych cudzysłowów ( ""), zachowana jest dosłowna wartość wszystkich dołączonych znaków, z wyjątkiem znaku dolara ( $), odwrotnych znaków ( pojedyncze cudzysłowy wstecz ``) i odwrotnego ukośnika ( \).

Po umieszczeniu w back-ticks ( ``) powłoka interpretuje coś, co oznacza „wynik polecenia wewnątrz back-ticks”. Jest to określane jako „podstawianie polecenia”, ponieważ wynik polecenia jest zastępowany przez samo polecenie.

Bibliografia:

aneeshep
źródło
3
echo '$HOME' is "$HOME"

Pojedyncze cudzysłowy zapobiegają rozszerzaniu zmiennych, a podwójne cudzysłowy pozwalają.

ubfan1
źródło
2

Mówię ogólnie, ale:

""- Służy do przetwarzania niektórych informacji w nich przed wyjściem. (Jak w PHP.)

  • Na przykład: name=NESS; echo "Hello my name is $name"wyświetli:Hello my name is NESS

''- Służy do wyświetlania wyniku w obecnej postaci. (Również jak w PHP.)

  • Korzystając z powyższego przykładu, wyświetli Hello my name is $name

Różnica między podwójnymi i pojedynczymi cudzysłowami polega na tym, że podwójne cudzysłowy przetwarzają zmienną i pokazują wartość, podczas gdy pojedyncze cudzysłowy pokazują nazwę zmiennej bez przetwarzania.

`` - Służy do cytowania poleceń, które są później przypisywane do innej zmiennej.

Luis Alvarado
źródło
1

Pojedyncze cudzysłowy zawierają wartość, którą należy interpretować dosłownie: wszystkie typy rozwinięć są pomijane. Zazwyczaj stosowane, jeśli wartość zawiera lub może zawierać spacji (przestrzeń, kartę, new-line) lub znaków specjalnych ( $, \, `), że użytkownik nie chce być rozszerzona / traktowany specjalnie przez powłokę.

Podwójne cudzysłowy zawierają wartość, która będzie zawierała zmienne i dokonano zamiany znaków. Wymagane, gdy dane wyjściowe mogą zawierać białe znaki i muszą być przypisane jako pojedyncza wartość.

Cudzysłowy zawierają polecenie, którego wyniki są pożądane jako wartość. Nowsze powłoki pozwalają na użycie $(...)zamiast `...`. Wolę nowszą metodę.

Poniższy kod może pomóc zrozumieć, co się dzieje.

CMD = „ls.”
echo sq: $ CMD
ustaw $ CMD
echo raw 1: 1 $
echo raw: $ *
ustaw „$ CMD”
echo dq: 1 USD
echo bq: `$ CMD`
echo nowość: $ ($ CMD)
BillThor
źródło