User Tools

Site Tools


bash:экранирование

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'
bash/экранирование.txt · Last modified: 2023/04/06 10:18 (external edit)