<Попередній | зміст | Наступна>
Подвійні лапки
Перший тип цитування, який ми розглянемо подвійні лапки. Якщо ми помістимо текст у подвійні лапки, усі спеціальні символи, які використовує оболонка, втрачають своє особливе значення і розглядаються як звичайні символи. Виняток становлять «$», «\» (зворотна коса риса) та «`» (зворотні лапки). Це означає, що розділення слів, розширення імені шляху, розширення тильди та розширення дужок пригнічуються, але розширення параметрів, арифметичне розширення та підстановка команд все ще виконуються. Використовуючи подвійні лапки, ми можемо впоратися з іменами файлів, які містять вбудовані пробіли. Скажімо, ми стали нещасною жертвою файлу під назвою два слова.txt. Якщо ми спробуємо використати це в командному рядку, розділення слів призведе до того, що це буде розглядатися як два окремі аргументи, а не як бажаний один аргумент:
[me@linuxbox ~]$ ls -l два слова.txt
ls: неможливо отримати доступ до двох: немає такого файлу чи каталогу
ls: не вдається отримати доступ до words.txt: такого файлу чи каталогу немає
[me@linuxbox ~]$ ls -l два слова.txt
ls: неможливо отримати доступ до двох: немає такого файлу чи каталогу
ls: не вдається отримати доступ до words.txt: такого файлу чи каталогу немає
Використовуючи подвійні лапки, ми зупиняємо поділ слів і отримуємо потрібний результат; крім того, ми можемо навіть усунути пошкодження:
[me@linuxbox ~]$ ls -l "два слова.txt"
-rw-rw-r-- 1 я я 18 2016 02:20 два слова.txt [me@linuxbox ~]$ mv "два слова.txt" two_words.txt
[me@linuxbox ~]$ ls -l "два слова.txt"
-rw-rw-r-- 1 я я 18 2016 02:20 два слова.txt [me@linuxbox ~]$ mv "два слова.txt" two_words.txt
Там! Тепер нам не потрібно продовжувати вводити ці докучливі подвійні лапки.
Пам’ятайте, що розширення параметрів, арифметичне розширення та заміна команд усе ще мають місце в подвійних лапках:
[me@linuxbox ~]$ echo "$USER $((2+2)) $(cal)"
я 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 |
Нам варто трохи поглянути на вплив подвійних лапок на заміну команд. Спочатку давайте трохи глибше розглянемо, як працює розділення слів. У нашому попередньому прикладі ми бачили, як розщеплення слів видаляє зайві пробіли в тексті:
[me@linuxbox ~]$ луна це a
це перевірка
тест
[me@linuxbox ~]$ луна це a
це перевірка
За замовчуванням розбиття слів шукає наявність пробілів, табуляції та нового рядка (символів переходу рядка) і розглядає їх як роздільники між словами. Це означає, що пробіли без лапок, табуляції та нові рядки не вважаються частиною тексту. Вони служать лише як роздільники. Оскільки вони розділяють слова на різні аргументи, наш приклад командного рядка містить команду, за якою слідують чотири різні аргументи. Якщо ми додамо подвійні лапки:
[me@linuxbox ~]$ echo "це а
тест"
[me@linuxbox ~]$ echo "це а
це перевірка
це перевірка
поділ слів пригнічується, а вбудовані пробіли не розглядаються як роздільники, а стають частиною аргументу. Після додавання подвійних лапок наш командний рядок містить команду, за якою слідує один аргумент.
Той факт, що нові рядки вважаються роздільниками за механізмом поділу слів, спричиняє цікавий, хоча й тонкий, ефект на заміну команд. Розглянемо наступне:
[me@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
[me@linuxbox ~]$ echo "$(cal)"
лютого 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 аргументів. У другому — командний рядок з одним аргументом, який містить вбудовані пробіли та новий рядок.