Разница между одинарными и двойными кавычками в Bash
В Bash какие различия между одинарными кавычками (''
) и двойные кавычки (""
)?
7 ответов
Одинарные кавычки ничего не будут интерполировать, но двойные кавычки будут. Например: переменные, обратные ссылки, определенные \
убегает и т. д.
Пример:
$ echo "$(echo "upg")"
upg
$ echo '$(echo "upg")'
$(echo "upg")
В руководстве по Bash сказано следующее:
Заключение символов в одинарные кавычки (
'
) сохраняет буквальное значение каждого символа в кавычках. Одиночная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта.Заключение символов в двойные кавычки (
"
) сохраняет буквальное значение всех символов в кавычках, за исключением$
,`
,\
и, когда расширение истории включено,!
, Персонажи$
а также`
сохранить их особое значение в двойных кавычках (см. Расширения оболочки). Обратная косая черта сохраняет свое особое значение только тогда, когда за ней следует один из следующих символов:$
,`
,"
,\
или перевод строки. В двойных кавычках удаляются обратные слэши, за которыми следует один из этих символов. Обратная косая черта предшествующих символов без специального значения остается неизменной. Двойная кавычка может быть заключена в двойные кавычки, если им предшествует обратная косая черта. Если включено, расширение истории будет выполняться, если только!
в двойных кавычках экранируется обратная косая черта. Обратная косая черта, предшествующая!
не удаляется.Особые параметры
*
а также@
имеют особое значение в двойных кавычках (см. Расширение параметров оболочки).
Принятый ответ великолепен. Я делаю таблицу, которая помогает в быстром понимании темы. Объяснение включает в себя простую переменную 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 "" but has no significance for '
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"
---+-------------+-------------+--------------------------------------------------------------------
Смотрите также:
Если вы ссылаетесь на то, что происходит, когда вы что-то выводите, одинарные кавычки будут буквально повторять то, что у вас есть между ними, тогда как двойные кавычки будут оценивать переменные между ними и выводить значение переменной.
Например, это
#!/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
Другие объяснили очень хорошо и просто хотят привести простые примеры.
Вокруг текста можно использоватьодинарные кавычки, чтобы оболочка не интерпретировала какие-либо специальные символы. Знаки доллара, пробелы, амперсанды, звездочки и другие специальные символы игнорируются, если заключены в одинарные кавычки.
$ 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
Поскольку это фактический ответ при работе с цитатами в bash
Я добавлю еще один момент, упущенный в ответах выше, при работе с арифметическими операторами в оболочке.
bash
Оболочка поддерживает два способа выполнения арифметических операций, один из которых определяется встроенным let
командование и $((..))
оператор. Первое вычисляет арифметическое выражение, в то время как второе является скорее составным выражением.
Важно понимать, что арифметическое выражение, используемое с let
подвергается разделению слов, расширению пути, как и любые другие команды оболочки. Так что правильное цитирование и экранирование должны быть сделаны.
Смотрите этот пример при использовании let
let 'foo = 2 + 1'
echo $foo
3
Использование одинарных кавычек здесь абсолютно нормально, так как здесь нет необходимости в расширении переменных, рассмотрим случай
bar=1
let 'foo = $bar + 1'
с треском провалится, так как $bar
в одинарных кавычках не будет расширяться и должен быть в двойных кавычках
let 'foo = '"$bar"' + 1'
Это должно быть одной из причин, $((..))
всегда следует учитывать при использовании let
, Потому что внутри него содержимое не подлежит расщеплению. Предыдущий пример с использованием let
может быть просто написано как
(( bar=1, foo = bar + 1 ))
Всегда не забывайте использовать $((..))
без одинарных кавычек
Хотя $((..))
может использоваться с двойными кавычками, в этом нет никакой цели, так как в результате он не может содержать контент, который будет нуждаться в двойных кавычках. Просто убедитесь, что это не одиночные кавычки.
printf '%d\n' '$((1+1))'
-bash: printf: $((1+1)): invalid number
printf '%d\n' $((1+1))
2
printf '%d\n' "$((1+1))"
2
Может быть в некоторых особых случаях использования $((..))
Оператор внутри одной строки в кавычках, вам нужно интерполировать кавычки таким образом, чтобы оператор оставлялся без кавычек или в двойных кавычках. Например, рассмотрим случай, когда вы пытаетесь использовать оператор внутри curl
заявление, чтобы передать счетчик каждый раз, когда запрос сделан, сделать
curl http://myurl.com --data-binary '{"requestCounter":'"$((reqcnt++))"'}'
Обратите внимание на использование вложенных двойных кавычек внутри, без которых литеральная строка $((reqcnt++))
передается requestCounter
поле.
There is a clear distinction between the usage of ' '
а также " "
,
когда ' '
is used around anything, there is no "transformation or translation" done. It is printed as it is.
С " "
, whatever it surrounds, is "translated or transformed" into its value.
By translation/ transformation I mean the following: Anything within the single quotes will not be "translated" to their values. They will be taken as they are inside quotes. Пример: a=23
, затем echo '$a'
будет производить $a
на стандартном выходе. В то время как echo "$a"
будет производить 23
на стандартном выходе.
Нужен минимальный ответ, чтобы люди могли начать работу, не тратя много времени, как мне пришлось.
Ниже приводится, к удивлению (для тех, кто ищет ответ), полная команда:
$ echo '\'
выход которого:
\
Обратная косая черта, к удивлению даже давних пользователей bash, не имеет значения внутри одинарных кавычек. И ничего больше.