Linux. Кавычки в bash

14.03.2018

Теги: BashCLILinux

Оболочка распознает четыре типа знаков кавычек:

  • знак одиночной кавычки
  • знак двойной кавычки
  • знак обратного слэша
  • знак обратной кавычки

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

Чаще всего используются для объединения в единый элемент последовательности символов, включая пробелы. Рассмотрим пример:

$ cat phonebook.txt
Alice Chebba     973-555-2015
Barbara Swingle  201-555-9257
Liz Stachiw      212-555-2298
Susan Goldberg   201-555-7776
Susan Topple     212-555-4932
Tony Iannino     973-555-1295

Чтобы вывести сведения о конкретном абоненте, достаточно выполнить команду:

$ grep Susan phonebook.txt
Susan Goldberg   201-555-7776
Susan Topple     212-555-4932

Было найдено два абонента. Попробуем уточнить поиск:

$ grep Susan Goldberg phonebook.txt
grep: can't open Goldberg
Susan Goldberg   201-555-7776
Susan Topple     212-555-4932

Это не работает. Проблема в том, что в оболочке пробелы служат для разделения аргументов команды. Команда grep интерпретирует первый аргумент как шаблон для поиска, а все остальные — как имена файлов для поиска. Теперь попробуем так:

$ grep 'Susan Goldberg' phonebook.txt
Susan Goldberg   201-555-7776

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

$ file=/home/evgeniy/readme.txt
$ echo $file
/home/evgeniy/readme.txt
$ echo '$file'
$file
$ echo *
readme.txt phonebook.txt unix.txt
$ echo '*'
*

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

$ text='one two three four'
$ echo $text
one two three four
$ text='* means all files in the direcory'
$ echo $text
readme.txt phonebook.txt unix.txt means all files in the direcory

Во втором случае показано, что при подстановке значения пременной text оболочка интерпретирует * как указание на подстановку имен файлов из текущей директории. Чтобы избежать этого, надо делать так:

$ text='* means all files in the directory'
$ echo "$text"
* means all files in the directory

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

Двойные кавычки действуют таким же образом, как и одиночные, за исключением того, что они в меньшей стапени защищают свое содержимое. Если одиночные кавычки предписывают оболочке игнорировать все заключенные в них специальные символы, то двойные кавычки — игнорировать бо́льшую их часть. В частности, следующие три символа не игнорируются в двойных кавычках:

  • знак $
  • знак обратной кавычки
  • знак обратного слэша

Тот факт, что знак $ не игнорируется в двойных кавычках, означает, что вместо имени переменной оболочка подставляет значение этой переменной:

$ filelist=*
$ echo $filelist
readme.txt phonebook.txt unix.txt
echo '$filelist'
$filelist
$ echo "$filelist"
*

В последнем случае двойные кавычки предписывают оболочке подставить вместо имени переменной ее значение (символ *). Но поскольку подстановка имен файлов не выполняется в двойных кавычках, то символ * передается команде echo как отображаемое значение.

Рассмотрим еще один пример, нагладно демонстрирующий, чем отстутствие кавычек отличается от наличия двойных кавычек:

$ address="39 East 12th Street
> New York, N. Y. 10003"
$ echo $address
39 East 12th Street New York, N. Y. 10003
$ echo "$address"
39 East 12th Street
New York, N. Y. 10003

Оболочка удаляет символы пробела, табуляции и новой строки (т.е. все пробельные символы) из командной строки, а затем разделяет ее на аргументы, прежде чем передать их запрашиваемой команде. Поэтому при выводе значения переменной $address без кавычек, оболочка удалила символ новой строки. А затем передала команде echo девять аргументов.

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

Обратный слэш

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

$ filelist=*
$ echo \$filelist
$filelist

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

$ lines=first\
> second
$ echo $lines
firstsecond

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

$ echo "\$x"
$x
$ y=5
$ echo "Значение переменной \"y\" равно $y"
Значение переменной "y" равно 5

Подстановка команд

Оболочка имеет возможность заменить указанную команду результатом ее выполнения в любом месте командной строки. Выполнить подстановку можно двумя способами: заключив команду в обратные кавычки или использовать конструкцию $(…).

$ echo Your current working directory is $(pwd)
Your current working directory is /home/evgeniy

Поиск: Bash • CLI • Linux

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.