Мы уже знаем как работает развертывание строк. Нам также известно, что при развертывании строки, мы можем получить несколько разных строк. Например, при развертывании подстановки по шаблону, подстановка будет заменена на список файлов, каждый из которых будет передан команде в виде отдельного аргумента.
А что если нам нужно передать аргумент, содержащий символы пробела и переноса строк? Рассмотрим простой пример. Воспользуемся командой cal для вывода календаря.
1 2 3 4 5 6 7 8 9 10 11 12 |
[[email protected] test]$ cal November 2014 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [[email protected] test]$ |
Результат отображен аккуратно в виде таблички по дням недели, похожей на обычный календарь.
Теперь подставим результат при помощи развертывания в команду echo, которая выводит каждый переданный ей аргумент.
1 2 3 4 5 |
[[email protected] test]$ echo $(cal) November 2014 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [[email protected] test]$ |
Результат выглядит не так красиво. Мы потеряли все переносы строк и «лишние» пробелы.
Все дело в том, что строки отделяются друг от друга пробелами, так называемыми символами переноса строк и табуляции. Результатом развертывания стало несколько строк, разделенных пробелами, которые были переданы в команду echo как несколько аргументов.
Рассмотрим второй пример.
1 2 3 4 5 |
[[email protected] test]$ echo Summa pokupki ravna $100. Summa pokupki ravna 00. [[email protected] test]$ |
Мы потеряли символ валюты и первую цифру нашей «суммы покупки». Здесь сработало развертывание переменных. Но ведь нам же может понадобится вывести символ доллара. Так как же быть? Выход есть.
Различные специальные символы воспринимаются как управляющие символы, а не как часть строки. Например, символ пробела разделяет аргументы, знак доллара ($) используется при развертывании подстановок, перенос строки указывает конец команды.
Экранирование символов
Различные специальные символы воспринимаются как управляющие символы, а не как часть строки. Например, символ пробела разделяет аргументы, знак доллара ($) используется при развертывании подстановок, перенос строки указывает конец команды.
Чтобы использовать специальные символы, их можно экранировать специальным символом «\» (обратная косая черта).
1 2 3 4 5 6 |
[[email protected] test]$ echo Stroka\ \ \ s probleami\ > perenosom stroki i summoi pokupki \$100. Stroka s probleamiperenosom stroki i summoi pokupki $100. [[email protected] test]$ |
В этот раз в строке все наши пробелы и остались, а символ валюты не был воспринят развертывание переменной. При вводе команды в конце первой строки (перед нажатием Enter) мы поставили символ экранирования, поэтому Linux Shell не стал исполнять команду сразу, а предложил ее продолжить на второй строке. Это очень удобно при написании длинных инструкций (например, команда с множеством аргументов). Мы можем разбить строку на несколько в нужных нам местах, что сделает команду читаемой. В основном данный прием используется при написании Shell скриптов. Очень важно сделать его читаемым и понятным, чтобы в будущем не тратить время пытаясь вспомнить, что мы написали.
Но как же быть с развертыванием? Например, если мы желаем, чтобы результат развертывания был воспринят единым аргументом? И для этого есть простое решение 🙂
Двойные кавычки
Если строку или ее часть поместить в двойные кавычки, то все пробелы и переносы строк внутри будут сохранены.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[[email protected] test]$ echo "test test > > test" test test test [[email protected] test]$ echo "test test"test test testtest [[email protected] test]$ echo "$(cal)" November 2014 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [[email protected] test]$ |
Как мы видим внутри двойных кавычек работает развертывание строк. Но разворачиваются лишь подстановки, начинающиеся с символа «$» или с обратными одинарными кавычками.
Подстановки файлов по шаблону или подстановки последовательностей воспринимаются как обычные строки без их развертывания.
1 2 3 4 5 |
Чтобы развернуть последовательность, нужно вынести ее за пределы кавычек.
1 2 3 4 5 |
Как мы видим, часть, которая осталась в кавычках, была воспринята как окружающий текст (между кавычкой и фигурной скобкой не должно быть пробела). Это позволяет нам использовать пробелы и результат развертывания в окружающем тексте при подстановке последовательностей 🙂
Одинарные кавычки
В строке или части строки, помещенной в одинарной кавычке, полностью подавляется развертывание подстановок. Текст, помещенный в одинарные кавычки остается неизменным.
1 2 3 4 5 |
Одинарные кавычки удобны для записи данных, в которых часто присутствуют специальные символы. Достаточно всю строку обернуть в одинарные кавычки и можно почти ни о чем не беспокоиться 🙂