Различия между двойными кавычками «», одинарными кавычками '' и обратными кавычками `` в командной строке?

43

Я часто вижу учебные материалы в Интернете или сообщения на этом сайте, в которых интенсивно используются следующие символы в командной строке. Часто кажется, что они используются для довольно похожих целей. Каковы различия между ними при использовании в командной строке или для программирования оболочки? Для каких целей я использую какие из них?

" " double quotes

' ' single quotes

` ` backticks
NES
источник

Ответы:

43

Для примера рассмотрим, что переменная fooсодержит uname( foo=uname).

  • echo "$foo"вывод uname, подставляя переменные в текст.
    • Для буквального $символа внутри "кавычек используйте \$; для буквального "использования \".
  • echo '$foo'выходы $foo, точная строка.
    • Даже 'не может быть экранирован, как \'внутри 'кавычек. Но вы можете использовать 'foo'\''bar'.
  • echo `$foo`вывод Linux, выполняя содержимое переменной и echoпечатая его.
shellholic
источник
\всегда трактуется буквально, когда заключено в одинарные кавычки, даже если оно предшествует '. После открытия 'следующее 'всегда интерпретируется как заключительная цитата. Нечто подобное 'заключению в кавычки в строке, заключенной в одинарные кавычки, может быть достигнуто путем завершения кавычек, экранирования по 'отдельности и повторного цитирования. То есть, хотя \'не работает между открывающими и закрывающими 'символами, '\''работает. (См Жиля «сек поправки к одному из моих постов , когда я сделал ту же ошибку для деталей.)
Eliah Каган
11

Это очень хорошо объясняется в соответствующем разделе руководства по bash. Вкратце, все в одинарных кавычках интерпретируется буквально. Так, например:

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

Сравните это с версиями без кавычек:

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

Двойные кавычки позволяют расширение переменной (также расширение истории и некоторые другие вещи). По сути, вы используете их, когда имеете дело с чем-то, что вы хотите видеть расширенным. Например:

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

Другими словами, одинарные кавычки полностью защищают строку от оболочки, тогда как двойные кавычки защищают некоторые вещи (например, пробелы), но позволяют переменным и специальным символам правильно расширяться / интерпретироваться.

Тердон
источник
1
не уверен, что ОП был изменен после факта, но в этом ответе не упоминается обратная связь?
Александр Миллс
5

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

Используя двойные кавычки ( ""), сохраняется буквальное значение всех символов, кроме знака доллара ( $), обратных кавычек (обратные одинарные кавычки ``) и обратного слеша ( \).

Когда ``оболочка заключена в back-ticks ( ), оболочка что-то интерпретирует как «вывод команды внутри back-ticks». Это называется «подстановка команды», поскольку вывод команды заменяется самой командой.

Ссылки:

aneeshep
источник
3
echo '$HOME' is "$HOME"

Одинарные кавычки предотвращают расширение переменной, а двойные кавычки позволяют это.

ubfan1
источник
2

Просто говорю в общем но:

""- Используется для обработки некоторой информации внутри них перед выводом. (Как в PHP.)

  • Например: name=NESS; echo "Hello my name is $name"будет выводить:Hello my name is NESS

''- Используется, чтобы показать вывод как есть. (Также как в PHP.)

  • Используя приведенный выше пример, он выведет Hello my name is $name

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

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

Луис Альварадо
источник
1

Одинарные кавычки заключают в себе значение, которое следует понимать буквально: все типы раскрытия исключаются. Обычно используется , если значение включает или может включать пробелы (пробел, табуляция, новая строка), или специальные символы ( $, \, `) , что пользователь не хочет быть расширен / обрабатывают специально оболочкой.

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

Обратные кавычки заключают в себе команду, результаты которой требуются в качестве значения. Новые оболочки позволяют использовать $(...)вместо `...`. Я предпочитаю более новый метод.

Следующий код может помочь понять, что происходит.

CMD = 'ls.'
echo sq: $ CMD
установить $ CMD
эхо необработанное 1: $ 1
echo raw: $ *
установить "$ CMD"
echo dq: $ 1
echo bq: `$ CMD`
echo new: $ ($ CMD)
BillThor
источник