Перейти к основному содержанию
Рецепты Linux

Main navigation

  • Основы
  • Система
  • Команды
  • Программы
  • Дистро
  • Интерфейсы
  • Устройства
  • Доки
User account menu
  • Войти

Строка навигации

  1. Главная
  2. ABS Guide
  3. Часть 4. Материал повышенной сложности
  4. Глава 33. Разное

33.5. "Цветные" сценарии

Для установки атрибутов отображения информации на экране, таких как: жирный текст, цвет символов, цвет фона и т.п., с давних пор используются ANSI [62] escape-последовательности. Эти последовательности широко используются в пакетных файлах DOS, эти же последовательности используются и в сценариях Bash.

Пример 33-9. "Цветная" адресная книга

#!/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"
Note

Ключ -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-10. Вывод цветного текста

#!/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) Добавьте возможность управления цветом фона.
Caution

Однако, как обычно, в бочке меда есть ложка дегтя. Escape-последовательности ANSI совершенно не переносимы. Вывод в одном эмуляторе терминала (или в консоли) может разительно отличаться от вывода в другом эмуляторе. "Расцвеченные" сценарии, дающие изумительно красивый вывод текста на одном терминале, могут давать совершенно нечитаемый текст на другом. Это ставит под сомнение практическую ценность "расцвечивания" вывода в сценариях, низводя ее до уровня никчемной "игрушки".

Moshe Jacobson разработал утилиту color (http://runslinux.net/projects/color), которая значительно упрощает работу с ANSI escape-последовательностями, заменяя, только что обсуждавшиеся, неуклюжие конструкции, логичным и понятным синтаксисом.

Notes

[62]

ANSI -- аббревиатура от American National Standards Institute.

Перекрёстные ссылки книги для 33.5. "Цветные" сценарии

  • 33.4. Рекурсия
  • Вверх
  • 33.6. Оптимизация

Book navigation

  • Содержание
  • Часть 1. Введение
  • Часть 2. Основы
  • Часть 3. Углубленный материал
  • Часть 4. Материал повышенной сложности
    • Глава 18. Регулярные выражения
    • Глава 19. Подоболочки, или Subshells
    • Глава 20. Ограниченный режим командной оболочки
    • Глава 21. Подстановка процессов
    • Глава 22. Функции
    • Глава 23. Псевдонимы
    • Глава 24. Списки команд
    • Глава 25. Массивы
    • Глава 26. Файлы
    • Глава 27. /dev и /proc
    • Глава 28. /dev/zero и /dev/null
    • Глава 29. Отладка сценариев
    • Глава 30. Необязательные параметры (ключи)
    • Глава 31. Широко распространенные ошибки
    • Глава 32. Стиль программирования
    • Глава 33. Разное
      • 33.1. Интерактивный и неинтерактивный режим работы
      • 33.2. Сценарии-обертки
      • 33.3. Операции сравнения: Альтернативные решения
      • 33.4. Рекурсия
      • 33.5. "Цветные" сценарии
      • 33.6. Оптимизация
      • 33.7. Разные советы
      • 33.8. Проблемы безопасности
      • 33.9. Проблемы переносимости
      • 33.10. Сценарии командной оболочки под Windows
    • Глава 34. Bash, версия 2
  • Глава 35. Замечания и дополнения
  • Библиография
  • Приложение A. Дополнительные примеры сценариев
  • Приложение B. Справочная информация
  • Приложение C. Маленький учебник по Sed и Awk
  • Приложение D. Коды завершения, имеющие предопределенный смысл
  • Приложение E. Подробное введение в операции ввода-вывода и перенаправление ввода-вывода
  • Приложение F. Системные каталоги
  • Приложение G. Локализация
  • Приложение H. История команд
  • Приложение I. Пример файла .bashrc
  • Приложение J. Преобразование пакетных (*.bat) файлов DOS в сценарии командной оболочки
  • Приложение K. Упражнения
  • Приложение L. Хронология
  • Приложение M. Авторские права

Последние материалы

  • Приложение scanimage
    5 hours ago
  • Утилита sensors
    4 days ago
  • Сканер Rkhunter
    1 week 4 days ago
  • Программа resize2fs
    2 weeks 3 days ago
  • Аудиопроигрыватель QMMP
    3 weeks 1 day ago
RSS feed

Secondary menu

  • О проекте

© 2008–2025 Олег Меньшенин mensh@yandex.ru