Библиотека сайта rus-linux.net
В чем разница между одинарными и двойными кавычками в сценариях командной оболочки Bash?
Оригинал: What's the Difference Between Single and Double Quotes in the Bash Shell?
Автор: Lowell Heddings
Дата публикации: 14 сентября 2014 г.
Перевод: А.Панин
Дата перевода: 10 ноября 2016 г.
Размещение текста в кавычках является обычной практикой при работе с интерфейсом командной строки системы, особенно при необходимости обработки файлов с символами пробелов в именах, но знаете ли вы, когда следует использовать одинарные кавычки, а когда двойные? Давайте рассмотрим различия между данными типами кавычек, а также примеры их использования.
Основное правило заключается в том, что двойные кавычки позволяют осуществлять раскрытие переменных, в то время, как одинарные кавычки не позволяют этого. Если вам нужны подробности, продолжайте чтение.
Кавычки и обычный текст
Если вы просто помещаете несколько слов в кавычки, тип этих кавычек не имеет никакого значения, так как в данном случае кавычки обоих типов будут работать одинаково. Например, две приведенных ниже команды будут создавать директорию с именем "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
из текущей директории.
Давайте подведем итоги
Теперь, когда мы рассмотрели примеры, мы можем подвести итоги, чтобы окончательно прояснить ситуацию:
Двойные кавычки
- Следует использовать тогда, когда вам нужно размещать значения переменных или вывод команд в рамках строк.
-
Все символы интерпретируются обычным образом, за исключением символов
$
и`
, которые используются для раскрытия переменных и команд соответственно.
Одинарные кавычки
- Все символы интерпретируются как строчные символы.
На этом тему использования кавычек в командной оболочке можно считать исчерпанной. Используйте их разумно.