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

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"


Ключ -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.073. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз