Книга: Искусство программирования на языке сценариев командной оболочки
Пример 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.
- Пример 5-1. Вывод "причудливых" переменных
- 2.1.3. Экранированные последовательности Юникода
- Пример 34-1. Расширение строк
- Пример установочного скрипта
- Пример из практики
- ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ
- Примеры получения статистики
- Пример применения метода «пять почему»
- Пример 12-8. Частота встречаемости отдельных слов
- 1.2.5. Пример программы
- Пример 17-10. Блочный комментарий
- Примеры