Table of Contents
Bash Экранирование
Посмотрим на такую простую команду:
echo this is a test this is a test
Или такую
echo Итог: $100.00 Итог: 00.00
В первом примере механизм разбиения на слова удалил дополнительные пробелы из списка аргументов команды <html>echo</html>. Во втором — механизм подстановки параметров подставил пустую строку вместо $1, потому что не нашел такую переменную.
Командная оболочка предоставляет механизм, который называется экранированием (quoting), для выборочного подавления нежелательной подстановки.
Двойные кавычки
Если заключить текст в двойные кавычки, все специальные символы потеряют свое специальное значение и будут интерпретироваться как обычные символы.
Исключение составляют:
- <html>$</html> – знак доллара;
- <html>\</html> – обратный слеш;
- <html>`</html> – обратный апостроф.
То есть разбиение на слова, подстановка путей, подстановка тильды и подстановка фигурных скобок выполняться не будут, но подстановка параметров, подстановка значений арифметических выражений и подстановка команд все еще будут выполняться.
Благодаря двойным кавычкам мы сможем обрабатывать имена файлов с пробелами.
ls -l "Two Worlds.txt" -rw-r--r-- 1 root root 0 May 20 15:14 'Two Worlds.txt'
Сначала рассмотрим действие механизма разбиения на слова. В одном из примеров, приведенных выше, мы видели, как механизм разбиения на слова удаляет дополнительные пробелы из текста:
echo this is a test this is a test
По умолчанию этот механизм находит пробелы, символы табуляции и символы перевода строки и интерпретирует их как разделители слов. То есть вне кавычек упомянутые символы не считаются частью текста. Они являются лишь разделителями. Поскольку они делят слова на аргументы, получается, что в нашем примере командная строка состоит из команды и четырех аргументов. Однако если добавить двойные кавычки, разбиение на слова выполняться не будет и внутренние пробелы не будут считаться разделителями — они станут частью аргумента:
echo "this is a test" this is a test
После добавления двойных кавычек командная строка будет состоять из команды и одного аргумента.
Тот факт, что символы перевода строки интерпретируются механизмом разбиения на слова как разделители, вызывает интересный и трудноуловимый эффект при подстановке команд. Посмотрим:
echo $(cal) May 2021 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 31
echo "$(cal)" May 2021 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 31
В первом случае подстановка команд без кавычек привела к созданию командной строки с 38 аргументами, а во втором случае получилась командная строка с одним аргументом, включающим внутренние пробелы и символы перевода строки.
Одиночные кавычки
Если требуется подавить все подстановки, используйте одиночные кавычки. Ниже для сравнения приводятся результаты неэкранированной команды и команды, экранированной двойными и одиночными кавычками:
# Без кавычек echo ~ ./*.txt {a..d} $(echo John Doe) $((2+2)) $USER /root ./Out.txt ./Two Worlds.txt a b c d John Doe 4 root # Двойные кавычки echo "~ ./*.txt {a..d} $(echo John Doe) $((2+2)) $USER" ~ ./*.txt {a..d} John Doe 4 root # Одиночные кавычки echo '~ ./*.txt {a..d} $(echo John Doe) $((2+2)) $USER' ~ ./*.txt {a..d} $(echo John Doe) $((2+2)) $USER
Как видно, каждый следующий уровень экранирования все больше и больше подавляет подстановку.
Экранирование символов
Иногда бывает необходимо экранировать только один символ. Для этого достаточно добавить перед символом обратный слеш, который в данном случае называется экранирующим символом (escape character). Часто этот прием используется в двойных кавычках, чтобы выборочно предотвратить подстановку:
echo "Баланс Пользователя $USER: \$5.00" Баланс Пользователя root: $5.00
Экранирование символов также широко применяется для подавления специального значения символов в именах файлов. Например, в именах файлов допускается использование символов, которые имеют специальное значение для командной оболочки. К их числу относятся: <html>$</html>, <html>!</html>, <html>&</html>, пробел и др. Чтобы включить специальный символ в имя файла, его достаточно экранировать, как показано ниже:
touch first\&name
Чтобы включить сам экранирующий символ, его также нужно экранировать, введя <html>\\</html>. Имейте в виду, что внутри одиночных кавычек обратный слеш теряет свое специальное значение и интерпретируется как обычный символ.
Управляющие последовательности
Обратный слеш используется не только в роли экранирующего символа, но и как часть специальных символов, которые называют управляющими кодами(control codes). Первые 32 символа в схеме кодирования ASCII использовались для передачи различных команд в устройствах, таких как телетайп. Некоторые из этих кодов хорошо знакомы(табуляция, забой, перевод строки и возврат каретки), тогда как другие — нет (пустой символ, конец передачи и подтверждение).
Управляющие последовательности
Управляющие коды | Значение |
---|---|
<html>\a</html> | Зуммер («предупреждение» – заставляет компьютер подать звуковой сигнал) |
<html>\b</html> | Забой (backspace) |
<html>\n</html> | Новая строка (в Unix-подобных системах этот символ выполняет перевод строки) |
<html>\r</html> | Возврат каретки |
<html>\t</html> | Табуляция |
Параметр <html>-e</html> команды <html>echo</html> включает интерпретацию управляющих последовательностей. Их можно также заключать в конструкцию <html>$' '</html>. Ниже демонстрируется использование команды <html>sleep</html> для создания элементарного таймера, простой программы, которая всего лишь ждет указанное число секунд и завершается.
sleep 10; echo -e "Time's up\a"
Либо так:
sleep 4; echo "Wake Up" $'\a'