После добавления двойных кавычек командная строка будет состоять из команды и одного аргумента.
Тот факт, что символы перевода строки интерпретируются механизмом разбиения на слова как разделители, вызывает интересный и трудноуловимый эффект при подстановке команд. Взгляните:
[me@linuxbox ~]$ echo $(cal)
February 2012 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 ~]$ echo "$(cal)"
February 2012
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 аргументами, а во втором случае получилась командная строка с одним аргументом, включающим внутренние пробелы и символы перевода строки.
Одиночные кавычки
Если вам требуется подавить
[me@linuxbox ~]$ echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
text /home/me/ls-output.txt a b foo 4 me
[me@linuxbox ~]$ echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER"
text ~/*.txt {a,b} foo 4 me
[me@linuxbox ~]$ echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER'
text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
Как видите, каждый следующий уровень экранирования все больше и больше подавляет подстановку.
Экранирование символов
Иногда бывает необходимо экранировать только один символ. Для этого достаточно добавить перед символом обратный слеш, который в данном случае называется
[me@linuxbox ~]$ echo "Баланс счета пользователя $USER: \$5.00"
Баланс счета пользователя me: $5.00
Экранирование символов также широко применяется для подавления специального значения символов в именах файлов. Например, в именах файлов допускается использование символов, которые имеют специальное значение для командной оболочки. К их числу относятся: $, !, &, (пробел) и др. Чтобы включить специальный символ в имя файла, его достаточно экранировать, как показано ниже:
[me@linuxbox ~]$ mv bad\&filename good_filename
Чтобы включить сам экранирующий символ, его также нужно экранировать, введя \\. Имейте в виду, что внутри одиночных кавычек обратный слеш теряет свое специальное значение и интерпретируется как обычный символ.
Заключительное замечание
По мере накопления опыта использования командной оболочки мы все чаще будем использовать возможности подстановки и экранирования, поэтому важно хорошо понимать, как они работают. Фактически можно смело утверждать, что эти два механизма являются наиболее важными для изучения аспектами командной оболочки. Без надлежащего понимания того, как действует подстановка, командная оболочка будет оставаться источником непонимания и домыслов, при этом многие ее возможности останутся неиспользованными.
управляющие последовательности
Обратный слеш используется не только в роли экранирующего символа, но и как часть специальных символов, которые называют
Таблица 7.2. Управляющие последовательности
Управляющая последовательность
Значение
\a
Звонок («предупреждение» — заставляет компьютер подать звуковой сигнал)
\b
Забой (backspace)
\n
Новая строка (в Unix-подобных системах этот символ выполняет перевод строки)
\r
Возврат каретки
\t
Табуляция
В этой таблице перечислены некоторые наиболее известные управляющие последовательности. Идея использования обратного слеша зародилась в языке программирования C и была заимствована многими другими языками, включая язык командной оболочки. Параметр -e команды echo включает интерпретацию управляющих последовательностей. Их можно также заключать в конструкцию $' '. Ниже демонстрируется использование команды sleep, простой программы, которая всего лишь ждет указанное число секунд и завершается, для создания элементарного таймера.
sleep 10; echo -e "Time's up\a"
То же самое можно выразить так:
sleep 10; echo "Time's up" $'\a'
8. Продвинутые приемы работы с клавиатурой