Книга: Искусство программирования на языке сценариев командной оболочки
33.5. "Цветные" сценарии
Для установки атрибутов отображения информации на экране, таких как: жирный текст, цвет символов, цвет фона и т.п., с давних пор используются ANSI[ 62 ] escape-последовательности. Эти последовательности широко используются в пакетных файлах DOS, эти же последовательности используются и в сценариях Bash.
Пример 33-8. "Цветная" адресная книга
#!/bin/bash
# ex30a.sh: Версия сценария ex30.sh, с добавлением цвета .
# Грубый пример базы данных
clear # Очистка экрана
echo -n " "
echo -e 'E[37;44m'"33[1mСписок33[0m"
# Белый текст на синем фоне
echo; echo
echo -e "33[1mВыберите интересующую Вас персону:33[0m"
# Жирный шрифт
tput sgr0
echo "(Введите только первую букву имени.)"
echo
echo -en 'E[47;34m'"33[1mE33[0m" # Синий
tput sgr0 # сброс цвета
echo "vans, Roland" # "[E]vans, Roland"
echo -en 'E[47;35m'"33[1mJ33[0m" # Пурпурный
tput sgr0
echo "ones, Mildred"
echo -en 'E[47;32m'"33[1mS33[0m" # Зеленый
tput sgr0
echo "mith, Julie"
echo -en 'E[47;31m'"33[1mZ33[0m" # Красный
tput sgr0
echo "ane, Morris"
echo
read person
case "$person" in
# Обратите внимание: переменная взята в кавычки.
"E" | "e" )
# Пользователь может ввести как заглавную, так и строчную букву.
echo
echo "Roland Evans"
echo "4321 Floppy Dr."
echo "Hardscrabble, CO 80753"
echo "(303) 734-9874"
echo "(303) 734-9892 fax"
echo "[email protected]"
echo "Старый друг и партнер по бизнесу"
"J" | "j" )
echo
echo "Mildred Jones"
echo "249 E. 7th St., Apt. 19"
echo "New York, NY 10009"
echo "(212) 533-2814"
echo "(212) 533-9972 fax"
echo "[email protected]"
echo "Подружка"
echo "День рождения: 11 февраля"
# Информация о Smith и Zane будет добавлена позднее.
* )
# Выбор по-умолчанию.
# "Пустой" ввод тоже обрабатывается здесь.
echo
echo "Нет данных."
esac
tput sgr0 # Сброс цвета
echo
exit 0
Самая простая и, на мой взгляд, самая полезная escape-последовательность -- это "жирный текст", 33[1m ... 33[0m. Здесь, комбинация 33 представляет escape-символ, кобинация "[1" -- включает вывод жирным текстом, а "[0" -- выключает. Символ "m" -- завершает каждую из escape-последовательностей.
bash$ echo -e "33[1mЭто жирный текст.33[0m"
Простая escape-последовательность, которая управляет атрибутом подчеркивания (в rxvt и aterm).
bash$ echo -e "33[4mЭто подчеркнутый текст.33[0m"
Другие escape-последовательности, изменяющие атрибуты цвета:
bash$ echo -e 'E[34;47mЭтот текст выводится синим цветом.'; tput sgr0
bash$ echo -e 'E[33;44m'"желтый текст на синем фоне"; tput sgr0
Команда tput sgr0 возвращает настройки терминала в первоначальное состояние.
Вывод цветного текста осуществляется по следующему шаблону:.
echo -e 'E[COLOR1;COLOR2mКакой либо текст.'
Где "E[" -- начало escape-последовательности. Числа "COLOR1" и "COLOR2", разделенные точкой с запятой, задают цвет символов и цвет фона, в соответствии с таблицей цветов, приведенной ниже. (Порядок указания цвета текста и фона не имеет значения, поскольку диапазоны числовых значений цвета для текста и фона не пересекаются). Символ "m" -- должен завершать escape-последовательность.
Обратите внимание: одиночные кавычки окружают все, что следует за echo -e.
Числовые значения цвета, приведенные ниже, справедливы для rxvt. Для других эмуляторов они могут несколько отличаться.
Таблица 33-1. Числовые значения цвета в escape-последовательностях
Цвет | Текст | Фон |
---|---|---|
черный | 30 | 40 |
красный | 31 | 41 |
зеленый | 32 | 42 |
желтый | 33 | 43 |
синий | 34 | 44 |
пурпурный | 35 | 45 |
зеленовато-голубой | 36 | 46 |
белый | 37 | 47 |
Пример 33-9. Вывод цветного текста
#!/bin/bash
# color-echo.sh: Вывод цветных сообщений.
black='E[30;47m'
red='E[31;47m'
green='E[32;47m'
yellow='E[33;47m'
blue='E[34;47m'
magenta='E[35;47m'
cyan='E[36;47m'
white='E[37;47m'
cecho () # Color-echo.
# Аргумент $1 = текст сообщения
# Аргумент $2 = цвет
{
local default_msg="Нет сообщений."
# Не обязательно должна быть локальной.
message=${1:-$default_msg} # Текст сообщения по-умолчанию.
color=${2:-$black} # Цвет по-умолчанию черный.
echo -e "$color"
echo "$message"
tput sgr0 # Восстановление первоначальных настроек терминала.
return
}
# Попробум что-нибудь вывести.
# ----------------------------------------------------
cecho "Синий текст..." $blue
cecho "Пурпурный текст." $magenta
cecho "Позеленевший от зависти." $green
cecho "Похоже на красный?" $red
cecho "Циан, более известный как цвет морской волны." $cyan
cecho "Цвет не задан (по-умолчанию черный)."
# Аргумент $color отсутствует.
cecho ""Пустой" цвет (по-умолчанию черный)." ""
# Передан "пустой" аргумент цвета.
cecho
# Ни сообщение ни цвет не переданы.
cecho "" ""
# Функции переданы "пустые" аргументы $message и $color.
# ----------------------------------------------------
echo
exit 0
# Упражнения:
# ---------
# 1) Добавьте в функцию 'cecho ()' возможность вывода "жирного текста".
# 2) Добавьте возможность управления цветом фона.
Moshe Jacobson разработал утилиту color (http://runslinux.net/projects/color), которая значительно упрощает работу с ANSI escape-последовательностями, заменяя, только что обсуждавшиеся, неуклюжие конструкции, логичным и понятным синтаксисом.
- Восстановление "безнадежных" баз данных. InterBase Surgeon
- Основные "рычаги" управления производительностью
- Using Double Quotes to Resolve Variables in Strings with Embedded Spaces
- 4.11.4. Правила "все кроме"
- 5.5. ПРИМЕР РАЗРАБОТКИ ОПИСАНИЯ ПРОЦЕССА "КИПЯЧЕНИЕ ВОДЫ В ЧАЙНИКЕ"
- Рис. 201. Выберите "Через высокоскоростное подключение, запрашивающее имя пользователя и пароль"
- Доступ к "внешним" переменным
- Пример 7-1. Что есть "истина"?
- Пример 5-1. Вывод "причудливых" переменных
- Как работают сценарии. События
- Disk Quotas
- Implementing Quotas