<Предыдущая | Содержание: | Следующая>
Двойные кавычки
Первый тип цитирования, который мы рассмотрим, это двойные кавычки. Если мы помещаем текст в двойные кавычки, все специальные символы, используемые оболочкой, теряют свое особое значение и рассматриваются как обычные символы. Исключения составляют «$», «\» (обратная косая черта) и «» (обратная кавычка). Это означает, что разделение слов, расширение имени пути, раскрытие тильды и раскрытие фигурных скобок подавляется, но расширение параметров, арифметическое расширение и подстановка команд по-прежнему выполняются. Используя двойные кавычки, мы можем справиться с именами файлов, содержащими встроенные пробелы. Допустим, мы стали несчастной жертвой файла под названием два слова.txt. Если мы попытаемся использовать это в командной строке, разделение слов приведет к тому, что это будет обрабатываться как два отдельных аргумента, а не как желаемый единственный аргумент:
[я @ linuxbox ~] $ ls -l два слова.txt
ls: невозможно получить доступ к двум: нет такого файла или каталога
ls: нет доступа к words.txt: нет такого файла или каталога
[я @ linuxbox ~] $ ls -l два слова.txt
ls: невозможно получить доступ к двум: нет такого файла или каталога
ls: нет доступа к words.txt: нет такого файла или каталога
Используя двойные кавычки, мы останавливаем разделение слов и получаем желаемый результат; в дальнейшем мы даже можем исправить повреждение:
[я @ linuxbox ~] $ ls -l "два слова.txt"
-rw-rw-r-- 1 я меня 18 2016 02:20 two words.txt [me @ linuxbox ~] $ mv "два слова.txt" two_words.txt
[я @ linuxbox ~] $ ls -l "два слова.txt"
-rw-rw-r-- 1 я меня 18 2016 02:20 two words.txt [me @ linuxbox ~] $ mv "два слова.txt" two_words.txt
Там! Теперь нам не нужно набирать надоедливые двойные кавычки.
Помните, что расширение параметров, арифметическое расширение и подстановка команд по-прежнему выполняются в двойных кавычках:
[я @ linuxbox ~] $ echo "$ USER $ ((2 + 2)) $ (кал)"
мне 4 февраля 2016
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 |
Нам следует уделить время тому, чтобы взглянуть на влияние двойных кавычек на подстановку команд. Сначала давайте посмотрим немного глубже, как работает разбиение слов. В нашем предыдущем примере мы видели, как появляется разделение слов для удаления лишних пробелов в нашем тексте:
[я @ linuxbox ~] $ эхо это
Это тест
тестXNUMX
[я @ linuxbox ~] $ эхо это
Это тест
По умолчанию при разделении слов выполняется поиск пробелов, табуляции и новых строк (символов перевода строки) и рассматривается как разделители между словами. Это означает, что не заключенные в кавычки области, табуляции и символы новой строки не считаются частью текста. Они служат только разделителями. Поскольку они разделяют слова на разные аргументы, в нашем примере командная строка содержит команду, за которой следуют четыре разных аргумента. Если мы добавим двойные кавычки:
[я @ linuxbox ~] $ эхо "это
тест"
[я @ linuxbox ~] $ эхо "это
Это тест
Это тест
разделение слов подавляется, а встроенные пробелы не рассматриваются как разделители, а становятся частью аргумента. После добавления двойных кавычек наша командная строка содержит команду, за которой следует единственный аргумент.
Тот факт, что новые строки считаются разделителями с помощью механизма разделения слов, вызывает интересный, хотя и тонкий, эффект на подстановку команд. Учтите следующее:
[я @ linuxbox ~] $ эхо $ (кал)
Февраль 2016 Вс Пн Вт Ср Чт Пт Сб 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
[я @ linuxbox ~] $ эхо "$ (кал)"
Февраль 2016
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 |
В первом случае подстановка команд без кавычек привела к тому, что командная строка содержала 38 аргументов. Во втором - командная строка с одним аргументом, который включает встроенные пробелы и символы новой строки.