Разница между одинарными и двойными кавычками в Bash

в bash, каковы различия между одинарными кавычками ('') и двойные кавычки ("")?

5 ответов


одинарные кавычки ничего не интерполируют, но двойные кавычки будут. Например: переменные, backticks, certain \ escapes и т. д.

пример:

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

руководство Bash имеет это, чтобы сказать:

3.1.2.2 Одинарные Кавычки

заключая символы в одинарные кавычки (') сохраняет литеральное значение каждого символа в кавычках. Одна цитата может не возникать между одинарными кавычками, даже при обратной косой черты.

3.1.2.3 Двойные Кавычки

содержащие символы в двойные кавычки (") сохраняет буквальное значение всех символов в кавычках, за исключением $, `, \, и, когда расширение истории включено,!. Персонажи $ и ` сохраняют свое особое значение в двойных кавычках (см. Оболочки Расширения). Обратная косая черта сохраняет свою особую значение только тогда, когда за ним следует один из следующих символов:$, `, ", \, или символ новой строки. В двойных кавычках удаляются обратные косые черты, за которыми следует один из этих символов. Обратные косые черты, предшествующие символам без специального значения, остаются неизмененными. Двойная кавычка может быть процитирована в двойных кавычках, предшествуя ей обратной косой чертой. Если включено, расширение истории будет выполнено, если ! появление в двойных кавычках экранируется с помощью обратной косой черты. Этот "\"в начале ! не удаляется.

специальные параметры * и @ имеют особое значение, когда в двойные кавычки (см. Расширение Параметра Оболочки).


Если вы имеете в виду, что происходит, когда вы Эхо что-то, одинарные кавычки будут буквально Эхо, что у вас есть между ними, в то время как двойные кавычки будут оценивать переменные между ними и выводить значение переменной.

например,

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

даст это:

double quotes gives you sometext
single quotes gives you $MYVAR

на принято отвечать это здорово. Я делаю таблицу, которая помогает в быстром понимании темы. Объяснение включает в себя простую переменную a а также индексированный массив arr.

если мы ставим

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

а то echo выражение во втором столбце, мы получим результат / поведение, показанное в третьем столбце. Четвертая колонка объясняет поведение.

 # | 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"
---+-------------+-------------+--------------------------------------------------------------------

посмотреть также:


другие объяснили очень хорошо и просто хотят дать с простыми примерами.

одинарные кавычки может использоваться вокруг текста, чтобы предотвратить интерпретацию оболочкой каких-либо специальных символов. Знаки доллара, пробелы, амперсанды, звездочки и другие специальные символы игнорируются, если они заключены в одинарные кавычки.

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

он даст это:

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

единственное, что нельзя помещать в одинарные кавычки-это один цитата.

двойные кавычки действуйте аналогично одинарным кавычкам, за исключением двойных кавычек, которые позволяют оболочке интерпретировать знаки доллара, обратные кавычки и обратные косые черты. Уже известно, что обратные косые черты препятствуют интерпретации одного специального символа. Это может быть полезно в двойных кавычках, если знак доллара должен использоваться как текст, а не для переменной. Он также позволяет экранировать двойные кавычки, чтобы они не интерпретировались как конец цитаты строка.

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

он даст это:

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

также можно заметить, что апостроф, который в противном случае интерпретировался бы как начало строки с кавычками, игнорируется в двойных кавычках. Переменные, однако, интерпретируются и заменяются их значениями в двойных кавычках.

$ echo "The current Oracle SID is $ORACLE_SID"

он даст это:

The current Oracle SID is test

кавычки полностью не похожи на одинарные или двойные кавычки. Вместо того, чтобы привыкать предотвратите интерпретацию специальных символов, обратные кавычки фактически заставляют выполнять команды, которые они заключают. После выполнения вложенных команд их выходные данные заменяются задними кавычками в исходной строке. Это станет яснее на примере.

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

он даст это:

Monday, September 28, 2015 

существует четкое различие между использованием ' ' и " ".

, когда ' ' используется вокруг чего-либо, нет" преобразования или перевода". Он напечатан как есть.

С " ", что бы он ни окружал, "переводится или преобразуется" в его значение.

под переводом / преобразованием я подразумеваю следующее: Все, что находится в одинарных кавычках, не будет "переведено" на их значения. Они будут приняты такими, какие они есть. внутри кавычек. Пример: a=23, потом echo '$a' будет $a на стандартный вывод. Тогда как echo "$a" будет 23 на стандартный вывод.