Advanced Bash-Scripting Guide: Искусство программирования на языке сценариев командной оболочки | ||
---|---|---|
Назад | Глава 33. Разное | Вперед |
Для установки атрибутов отображения информации на экране, таких как: жирный текст, цвет символов, цвет фона и т.п., с давних пор используются ANSI [1] escape-последовательности. Эти последовательности широко используются в пакетных файлах DOS, эти же последовательности используются и в сценариях Bash.
Пример 33-8. "Цветная" адресная книга
#!/bin/bash # ex30a.sh: Версия сценария ex30.sh, с добавлением цвета . # Грубый пример базы данных clear # Очистка экрана echo -n " " echo -e '\E[37;44m'"\033[1mСписок\033[0m" # Белый текст на синем фоне echo; echo echo -e "\033[1mВыберите интересующую Вас персону:\033[0m" # Жирный шрифт tput sgr0 echo "(Введите только первую букву имени.)" echo echo -en '\E[47;34m'"\033[1mE\033[0m" # Синий tput sgr0 # сброс цвета echo "vans, Roland" # "[E]vans, Roland" echo -en '\E[47;35m'"\033[1mJ\033[0m" # Пурпурный tput sgr0 echo "ones, Mildred" echo -en '\E[47;32m'"\033[1mS\033[0m" # Зеленый tput sgr0 echo "mith, Julie" echo -en '\E[47;31m'"\033[1mZ\033[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 "revans@zzy.net" 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 "milliej@loisaida.com" echo "Подружка" echo "День рождения: 11 февраля" ;; # Информация о Smith и Zane будет добавлена позднее. * ) # Выбор по-умолчанию. # "Пустой" ввод тоже обрабатывается здесь. echo echo "Нет данных." ;; esac tput sgr0 # Сброс цвета echo exit 0
Самая простая и, на мой взгляд, самая полезная escape-последовательность -- это "жирный текст", \033[1m ... \033[0m. Здесь, комбинация \033 представляет escape-символ, кобинация "[1" -- включает вывод жирным текстом, а "[0" -- выключает. Символ "m" -- завершает каждую из escape-последовательностей.
bash$ echo -e "\033[1mЭто жирный текст.\033[0m"
Простая escape-последовательность, которая управляет атрибутом подчеркивания (в rxvt и aterm).
bash$ echo -e "\033[4mЭто подчеркнутый текст.\033[0m"
Ключ -e, в команде echo, разрешает интерпретацию escape-последовательностей.
Другие 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) Добавьте возможность управления цветом фона.
Однако, как обычно, в бочке меда есть ложка дегтя. Escape-последовательности ANSI совершенно не переносимы. Вывод в одном эмуляторе терминала (или в консоли) может разительно отличаться от вывода в другом эмуляторе. "Расцвеченные" сценарии, дающие изумительно красивый вывод текста на одном терминале, могут давать совершенно нечитаемый текст на другом. Это ставит под сомнение практическую ценность "расцвечивания" вывода в сценариях, низводя ее до уровня никчемной "игрушки". |
Moshe Jacobson разработал утилиту color (http://runslinux.net/projects/color), которая значительно упрощает работу с ANSI escape-последовательностями, заменяя, только что обсуждавшиеся, неуклюжие конструкции, логичным и понятным синтаксисом.
[1] |
ANSI -- аббревиатура от American National Standards Institute. |