Книга: Искусство программирования на языке сценариев командной оболочки

Пример 5-2. Экранированные символы

Пример 5-2. Экранированные символы

#!/bin/bash

# escaped.sh: экранированные символы

echo; echo

echo "vvvv" # Вывод последовательности символов vvvv.

# Для вывода экранированных символов следует использовать ключ -e.

echo "============="

echo "ВЕРТИКАЛЬНАЯ ТАБУЛЯЦИЯ"

echo -e "vvvv" # Вывод 4-х вертикальных табуляций.

echo "=============="

echo "КАВЫЧКИ"

echo -e "42" # Выводит символ " (кавычки с восьмеричным кодом ASCII 42).

echo "=============="

# Конструкция $'X' делает использование ключа -e необязательным.

echo; echo "НОВАЯ СТРОКА И ЗВОНОК"

echo $'n' # Перевод строки.

echo $'a' # Звонок (сигнал).

echo "==============="

echo "КАВЫЧКИ"

# Bash версии 2 и выше допускает использование конструкции $'nnn'.

# Обратите внимание: здесь под 'nnn' подразумевается восьмеричное значение.

echo $'t 42 t' # Кавычки (") окруженные табуляцией.

# В конструкции $'xhhh' допускается использовать и шестнадцатеричные значения.

echo $'t x22 t' # Кавычки (") окруженные табуляцией.

# Спасибо Greg Keraunen, за это примечание.

# Ранние версии Bash допускали употребление конструкции в виде 'x022'.

echo "==============="

echo

# Запись ASCII-символов в переменную.

# ----------------------------------------

quote=$'42' # запись символа " в переменную.

echo "$quote Эта часть строки ограничена кавычками, $quote а эта -- нет."

echo

# Конкатенация ASCII-символов в переменную.

triple_underline=$'137137137' # 137 -- это восьмеричный код символа '_'.

echo "$triple_underline ПОДЧЕРКИВАНИЕ $triple_underline"

echo

ABC=$'10110210310' # 101, 102, 103 это A, B и C соответственно.

echo $ABC

echo; echo

escape=$'33' # 033 -- восьмеричный код экранирующего символа.

echo ""escape" выводится как $escape"

# вывод отсутствует.

echo; echo

exit 0

Еще один пример использования конструкции $' ' вы найдете в Пример 34-1.

"

кавычки

echo "Привет" # Привет

echo "Он сказал: "Привет"." # Он сказал: "Привет".

$

символ доллара (если за комбинацией символов $ следует имя переменной, то она не будет разыменована)

echo "$variable01" # выведет $variable01

обратный слэш

echo "" # выведет


Поведение символа сильно зависит от того экранирован ли он, ограничен ли кавычками или находится внутри конструкции подстановки команды или во вложенном документе.

# Простое экранирование и кавычки

echo z # z

echo z # z

echo 'z' # z

echo 'z' # z

echo "z" # z

echo "z" # z

# Подстановка команды

echo `echo z` # z

echo `echo z` # z

echo `echo z` # z

echo `echo \z` # z

echo `echo \z` # z

echo `echo \z` # z

echo `echo "z"` # z

echo `echo "z"` # z

# Встроенный документ

cat <<EOF

z

EOF # z

cat <<EOF

z

EOF # z

# Эти примеры предоставил Stephane Chazelas.

Отдельные символы в строке, которая записывается в переменную, могут быть экранированы, исключение составляет сам экранирующий символ.

variable=

echo "$variable"

# Не работает - дает сообщение об ошибке:

# test.sh: : command not found

# В "чистом" виде экранирующий (escape) символ не может быть записан в переменную.

#

# Фактически, в данном примере, происходит экранирование символа перевода строки

#+ в результате получается такая команда: variable=echo "$variable"

#+ ошибочное присваивание

variable=

23skidoo

echo "$variable" # 23skidoo

# Здесь все в порядке, поскольку вторая строка

#+ является нормальным, с точки зрения присваивания, выражением.

variable=

# ^ За escape-символом следует пробел

echo "$variable" # пробел

variable=

echo "$variable" #

variable=

echo "$variable"

# Не работает - сообщение об ошибке:

# test.sh: : command not found

#

# Первый escape-символ экранирует второй, а третий оказывается неэкранированным,

#+ результат тот же, что и в первом примере.

variable=\

echo "$variable" #

# Второй и четвертый escape-символы экранированы.

# Это нормально.

Экранирование пробелов предотвращает разбиение списка аргументов командной строки на отдельные аргументы.

file_list="/bin/cat /bin/gzip /bin/more /usr/bin/less /usr/bin/emacs-20.7"

# Список файлов как аргумент(ы) командной строки.

# Добавить два файла в список и вывести список.

ls -l /usr/X11R6/bin/xsetroot /sbin/dump $file_list

echo "-------------------------------------------------------------------------"

# Что произойдет, если экранировать пробелы в списке?

ls -l /usr/X11R6/bin/xsetroot /sbin/dump $file_list

# Ошибка: первые три файла будут "слиты" воедино

# и переданы команде 'ls -l' как один аргумент

# потому что два пробела, разделяющие аргументы (слова) -- экранированы.

Кроме того, escape-символ позволяет писать многострочные команды. Обычно, каждая команда занимает одну строку, но escape-символ позволяет экранировать символ перевода строки, в результате чего одна команда может занимать несколько строк.

(cd /source/directory && tar cf - . ) |

(cd /dest/directory && tar xpvf -)

# Команда копирования дерева каталогов.

# Разбита на две строки для большей удобочитаемости.

# Альтернативный вариант:

tar cf - -C /source/directory . |

tar xpvf - -C /dest/directory

# См. примечание ниже.

# (Спасибо Stephane Chazelas.)


Если строка сценария заканчивается символом создания конвейера |, то необходимость в применении символа , для экранирования перевода строки, отпадает. Тем не менее, считается хорошим тоном, всегда использовать символ "" в конце промежуточных строк многострочных команд.

echo "foo

bar"

#foo

#bar

echo

echo 'foo

bar' # Никаких различий.

#foo

#bar

echo

echo foo

bar # Перевод строки экранирован.

#foobar

echo

echo "foo

bar" # Внутри "нестрогих" кавычек символ "" интерпретируется как экранирующий.

#foobar

echo

echo 'foo

bar' # В "строгих" кавычках обратный слэш воспринимается как обычный символ.

#foo

#bar

# Примеры предложены Stephane Chazelas.

Оглавление книги


Генерация: 1.160. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз