Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

В чем разница между одинарными и двойными кавычками в сценариях командной оболочки Bash?

Оригинал: What's the Difference Between Single and Double Quotes in the Bash Shell?
Автор: Lowell Heddings
Дата публикации: 14 сентября 2014 г.
Перевод: А.Панин
Дата перевода: 10 ноября 2016 г.

В чем разница между одинарными и двойными кавычками в сценариях командной оболочки Bash?

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

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

Кавычки и обычный текст

Если вы просто помещаете несколько слов в кавычки, тип этих кавычек не имеет никакого значения, так как в данном случае кавычки обоих типов будут работать одинаково. Например, две приведенных ниже команды будут создавать директорию с именем "Test Directory":

mkdir "Test Directory"
mkdir 'Test Directory'

Опытные пользователи наверняка отметят, что при желании вы также можете использовать команду mkdir Test\ Directory.

Раскрытие переменных командной оболочки

Различие между одинарными и двойными кавычками становится более важным при работе с переменными в командной строке - по умолчанию Bash будет осуществлять раскрытие переменных, таких, как $test, заключающееся в преобразовании их значений в строковый формат и их подстановке в результирующие строки. В первую очередь присвоим значение переменной:

test="This is a test"

Теперь вы можете использовать переменную в командной строке аналогичным образом, в результате чего будет выводиться строка "This is a text":

echo $test

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

echo '$test'

в увидите ничто иное, как строку "$test", но после замены одинарных кавычек на двойные раскрытие переменной снова будет корректно осуществляться:

После замены одинарных кавычек на двойные раскрытие переменной снова будет корректно осуществляться

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

echo `pwd`/test

Если вашей рабочей директорией будет являться ваша домашняя директория, вы увидите аналогичный вывод:

/home/geek/test

Представим, к примеру, что вы перешли в директорию, в пути к которой присутствует символ пробела и хотите использовать команду ln для создания символьной ссылки на файл из этой директории. Обычно в подобных случаях в качестве первого аргумента команды ln приходится указывать полный путь к файлу, поэтому будет гораздо проще воспользоваться конструкцией `pwd`, в том числе, для сокращения количества вводимых символов.

Посмотрите, что случится при попытке использования данной команды без помещения первого аргумента в кавычки:

ln -s `pwd`/test /home/geek/linkedname

Результат использования команды без помещения первого аргумента в кавычки

Вместо этого вы можете поместить первый аргумент в кавычки:

ln -s "`pwd`/filename" /some/other/path

Давайте конкретизируем пример, предположив, что в нашем распоряжении имеется описанная структура директорий, причем в именах файлов присутствуют символы пробелов:

Результат использования команды по отношению к файлам с символами пробелов в именах

Так как команда unzip не позволяет использовать шаблон *, соответствующий всем файлам из директории, вам придется использовать цикл for вместо него. С этого момента все становится гораздо интереснее:

for f in *.zip;do unzip $f;done

Упс! Кажется, этот прем не сработал.

Некорректный вариант команды

Вместо этого мы можем поместить переменную $f в двойные кавычки следующим образом:

for f in *.zip;do unzip "$f";done

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

unzip "test 1.zip"

Разумеется, таким образом будет обрабатываться каждый из файлов с расширением .zip из текущей директории.

Давайте подведем итоги

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

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

  • Следует использовать тогда, когда вам нужно размещать значения переменных или вывод команд в рамках строк.
  • Все символы интерпретируются обычным образом, за исключением символов $ и `, которые используются для раскрытия переменных и команд соответственно.

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

  • Все символы интерпретируются как строчные символы.

На этом тему использования кавычек в командной оболочке можно считать исчерпанной. Используйте их разумно.