Różnica między pojedynczymi i podwójnymi cytatami w Bash

W Bash, jakie są różnice między pojedynczymi cudzysłowami ('') i podwójnymi cudzysłowami ("")?

Author: ghoti, 2011-07-14

5 answers

Pojedyncze cudzysłowy niczego nie interpolują, ale podwójne cudzysłowy. Na przykład: zmienne, backticki, pewne ucieczki \, itd.

Przykład:

$ echo "$(echo "upg")"
upg
$ echo '$(echo "upg")'
$(echo "upg")

Instrukcja Bash ma do powiedzenia:

3.1.2.2 Pojedyncze Cytaty

Zamknięcie znaków w pojedynczych cudzysłowach (') zachowuje literalną wartość każdego znaku w cudzysłowach. Pojedynczy cudzysłów może nie występować pomiędzy pojedynczymi cudzysłowami, nawet jeśli jest poprzedzony odwrotnym ukośnikiem.

3.1.2.3 Podwójne Cytaty

Zamknięcie znaków w podwójnych cudzysłowach (") zachowuje literalną wartość wszystkich znaków w cudzysłowach, z wyjątkiem $, `, \, i, gdy rozszerzenie historii jest włączone, !. Znaki $ i ` zachowują swoje specjalne znaczenie w podwójnych cudzysłowach (zobacz rozszerzenia powłoki). Ukośnik wsteczny zachowuje swoje specjalne znaczenie tylko wtedy, gdy następuje jeden z następujących znaków: $, `, ", \, lub newline. W podwójnych cudzysłowach usuwane są odwrotne ukośniki, po których następuje jeden z tych znaków. Ukośniki poprzedzające znaki bez specjalnego znaczenia pozostają niezmodyfikowane. Podwójny cudzysłów może być cytowany w podwójnych cudzysłowach, poprzedzając go odwrotnym ukośnikiem. Jeśli opcja jest włączona, Rozszerzenie historii zostanie wykonane, chyba że ! pojawiające się w podwójnych cudzysłowach zostanie uniknięte przy użyciu odwrotnego ukośnika. Odwrotny ukośnik poprzedzający ! nie jest usuwany.

Parametry specjalne * i @ mają specjalne znaczenie w cudzysłowach (zobacz rozszerzenie parametru powłoki ).

 372
Author: Adam Batkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-20 15:44:37

Jeśli odnosisz się do tego, co się dzieje, gdy echo coś, pojedyncze cudzysłowy dosłownie echo to, co masz między nimi, podczas gdy podwójne cudzysłowy oceniają zmienne między nimi i wypisują wartość zmiennej.

Na przykład to

#!/bin/sh
MYVAR=sometext
echo "double quotes gives you $MYVAR"
echo 'single quotes gives you $MYVAR'

Da to:

double quotes gives you sometext
single quotes gives you $MYVAR
 184
Author: likso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-11 02:10:26

Przyjęta odpowiedź jest świetna. Robię stolik, który pomaga w szybkim zrozumieniu tematu. Wyjaśnienie obejmuje prostą zmienną a oraz indeksowaną tablicę arr.

Jeśli ustawimy

a=apple      # a simple variable
arr=(apple)  # an indexed array with a single element

A następnie echo wyrażenie w drugiej kolumnie, otrzymamy wynik / zachowanie pokazane w trzeciej kolumnie. Czwarta kolumna wyjaśnia zachowanie.

 # | Expression  | Result      | Comments
---+-------------+-------------+--------------------------------------------------------------------
 1 | "$a"        | apple       | variables are expanded inside ""
 2 | '$a'        | $a          | variables are not expanded inside ''
 3 | "'$a'"      | 'apple'     | '' has no special meaning inside ""
 4 | '"$a"'      | "$a"        | "" is treated literally inside ''
 5 | '\''        | **invalid** | can not escape a ' within ''; use "'" or $'\'' (ANSI-C quoting)
 6 | "red$arocks"| red         | $arocks does not expand $a; use ${a}rocks to preserve $a
 7 | "redapple$" | redapple$   | $ followed by no variable name evaluates to $
 8 | '\"'        | \"          | \ has no special meaning inside ''
 9 | "\'"        | '           | \' is interpreted inside ""
10 | "\""        | "           | \" is interpreted inside ""
11 | "*"         | *           | glob does not work inside "" or ''
12 | "\t\n"      | \t\n        | \t and \n have no special meaning inside "" or ''; use ANSI-C quoting
13 | "`echo hi`" | hi          | `` and $() are evaluated inside ""
14 | '`echo hi`' | `echo hi`   | `` and $() are not evaluated inside ''
15 | '${arr[0]}' | ${arr[0]}   | array access not possible inside ''
16 | "${arr[0]}" | apple       | array access works inside ""
17 | $'$a\''     | $a'         | single quotes can be escaped inside ANSI-C quoting
18 | "$'\t'"     | $'\t'       | ANSI quoting is not interpreted inside ""
19 | '!cmd'      | !cmd        | history expansion character '!' is ignored inside ''
20 | "!cmd"      | cmd args    | expands to the most recent command matching "cmd"
---+-------------+-------------+--------------------------------------------------------------------

Zobacz też:

 135
Author: codeforester,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-20 18:13:40

Inni wyjaśnili bardzo dobrze i po prostu chcą podać proste przykłady.

Pojedyncze cudzysłowy mogą być używane wokół tekstu, aby zapobiec interpretacji przez powłokę znaków specjalnych. Znaki dolara, spacje, ampery, gwiazdki i inne znaki specjalne są ignorowane, gdy są zamknięte w pojedynczych cudzysłowach.

$ echo 'All sorts of things are ignored in single quotes, like $ & * ; |.' 

Da to:

All sorts of things are ignored in single quotes, like $ & * ; |.

Jedyną rzeczą, której nie można umieścić w pojedynczych cudzysłowach, jest pojedynczy cytat.

Podwójne cytaty act podobnie jak pojedyncze cudzysłowy, z wyjątkiem podwójnych cudzysłowów nadal pozwalają powłoce interpretować znaki dolara, back quotes I backslashes. Wiadomo już, że odwrotne ukośniki uniemożliwiają interpretację pojedynczego znaku specjalnego. Może to być przydatne w podwójnych cudzysłowach, jeśli znak dolara musi być użyty jako tekst zamiast zmiennej. Pozwala również na unikanie podwójnych cudzysłowów, więc nie są one interpretowane jako koniec cytowanego ciągu.

$ echo "Here's how we can use single ' and double \" quotes within double quotes"

Da to:

Here's how we can use single ' and double " quotes within double quotes

Może należy również zauważyć, że apostrof, który w przeciwnym razie byłby interpretowany jako początek cytowanego ciągu, jest ignorowany w podwójnych cudzysłowach. Zmienne są jednak interpretowane i zastępowane ich wartościami w podwójnych cudzysłowach.

$ echo "The current Oracle SID is $ORACLE_SID"

Da to:

The current Oracle SID is test

Back quotes są całkowicie odmienne od pojedynczych lub podwójnych cudzysłowów. Zamiast uniemożliwiać interpretację znaków specjalnych, cudzysłowy wymusza wykonywanie poleceń, które załącz. Po wykonaniu załączonych poleceń, ich wynik jest zastępowany w miejsce cudzysłowów w oryginalnej linii. Będzie to jaśniejsze na przykładzie.

$ today=`date '+%A, %B %d, %Y'`
$ echo $today 

Da to:

Monday, September 28, 2015 
 2
Author: Sree,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-14 18:21:33

Istnieje wyraźne rozróżnienie między użyciem ' ' i " ".

Kiedy ' ' jest używany wokół czegokolwiek, nie ma "transformacji lub tłumaczenia". Jest drukowany tak, jak jest.

Z " ", cokolwiek otacza, jest "tłumaczone lub przekształcane" na jego wartość.

Przez tłumaczenie / transformację mam na myśli następujące: Wszystko w pojedynczych cudzysłowach nie będzie "tłumaczone" na ich wartości. Będą brane tak, jak są wewnątrz cytatów. Przykład: a=23, następnie {[5] } wytworzy $a na standardowym wyjściu. Natomiast echo "$a" będzie produkować 23 na standardowym wyjściu.

 0
Author: a_ran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-21 12:42:43