Преамбула
Мы уже красили консоль при помощи tput (копия), но есть лучший способ, при помощи эскейп-последовательностей, там немного сложнее и запутаннее синтаксис, но зато нормальная поддержка 16 цветов и стилей.
ESC-последовательности
ESC-последовательность это код, который вставляется в вызов команды echo или printf перед, после или прямо посреди текста, который мы собираемся выводить.
Синтаксис кода такой: \x1b[???m, где вместо ??? надо вставить код цвета текста, фона или стиля текста. Коды можно перечислять через точку с запятой: \x1b[???;???;???m или несколько кодов подряд: \x1b[???m\x1b[???m\x1b[???m. 1b — это код символа ASCII 27, который соответствует коду клавиши ESC (откуда и название).
Коды цвета и фона
| # |
Название цвета |
Код цвета текста |
Код цвета фона |
| 0 |
Default (По умолчанию) |
39 |
49 |
| 1 |
Black (Черный) |
30 |
40 |
| 2 |
DarkRed (Темно-красный) |
31 |
41 |
| 3 |
DarkGreen (Зеленый) |
32 |
42 |
| 4 |
DarkYellow (Темно-желтый) |
33 |
43 |
| 5 |
DarkBlue (Синий) |
34 |
44 |
| 6 |
DarkMagenta (Темно-фиолетовый) |
35 |
45 |
| 7 |
DarkCyan (Темный аквамарин) |
36 |
46 |
| 8 |
Gray (Серый) |
37 |
47 |
| 9 |
DarkGray (Темно-серый) |
90 |
100 |
| 10 |
Red (Красный) |
91 |
101 |
| 11 |
Green (Ярко-зеленый) |
92 |
102 |
| 12 |
Yellow (Желтый) |
93 |
103 |
| 13 |
Blue (Голубой) |
94 |
104 |
| 14 |
Magenta (Фиолетовый) |
95 |
105 |
| 15 |
Cyan (Аквамарин) |
96 |
106 |
| 16 |
White (Белый) |
97 |
107 |
Код сброса: \x1b[0m — сбрасывает настройки консоли (цвет текста, фона и стиль) к значению по умолчанию.
Коды стиля текста
| Код стиля |
Стиль текста |
| 0 |
Default (По умолчанию) |
| 1 |
Bold (Жирный) |
| 4 |
Understrike (Подчернкутый) |
| 5 |
Blinking (Мигающий), не работает, получается серый текст на темно-сером фоне |
| 7 |
Inversing (Инверсия), цвет фона и текста меняются местами |
| 8 |
Invisible (Невидимый), не работает |
Тестовый скрипт
1. Проще всего покласть названия цветов, а также коды цвета и фона в массивы:
NAMES=(Default Black DarkRed DarkGreen DarkYellow DarkBlue DarkMagenta DarkCyan Gray DarkGray Red Green Yellow Blue Magenta Cyan White)
FGROUND=(39 30 31 32 33 34 35 36 37 90 91 92 93 94 95 96 97)
BGROUND=(49 40 41 42 43 44 45 46 47 100 101 102 103 104 105 106 107)
2. Создадим функцию echoc(), принимающую три параметра, цвет текста, цвет фона и стиль:
echoc() #Text, color, background, attributes
{
...
Тут будет код
...
}
Внутри функции:
if [ -z "$2" ];then
echo "$1"
return
fi
Если второго параметра нет, просто вызываем echo и выходим из функции.
E__="\x1b[${FGROUND[$2]}m"
Второй параметр, номер кода цвета текста в массиве, формируем ESC-последовательность с ним во временную переменную.
if [ -n "$3" ];then
E__="$E__\x1b[${BGROUND[$3]}m"
fi
Если есть третий параметр — добавляем ESC-последовательность для цвета фона.
if [ -n "$4" ];then
E__="$E__\x1b[$4""m"
fi
Если есть четвертый — добавляем код для стиля текста (1, 4, 5, 7, 8), см. таблицу выше.
echo -e "$E__$1\x1b[0m"
Выводим текст:
-e — параметр, позволяющий команде echo обрабатывать ESC-последовательности.
$E__ — переменная, в которой сформирована ESC-последовательность.
$1 — выводимый текст.
\x1b[0m — после текста вставляем код сброса.
3. Создаем функцию echocn(), которая от функции echoc() отличается одной строчкой:
echo -e -n "$E__$1\x1b[0m"
где -n — вывести текст без перевода строки
4. Выводим в цикле названия цветов, и примеры цвета и фона:
echo -e "Foreground color:\tBackground color:"
for N in {0..16}; do
if [ $N -eq 1 ];then #foreground
echocn "$N - ${NAMES[$N]}" $N "16"
else
echocn "$N - ${NAMES[$N]}" $N
fi
echo -e -n "\t\t\t"
if [ $N -gt 1 ];then
echoc " ${NAMES[$N]} " 1 $N #background
else
echoc " ${NAMES[$N]} " 0 $N
fi
done
5. И тестируем стили:
echo
echocn "Bold" 0 0 1; echo -n " "
echocn "Understrike" 0 0 4; echo -n " "
echocn "Blinking" 0 0 5; echo -n " "
echocn "Inversing" 0 0 7; echo -n " "
echocn "Invisible" 0 0 8; echo -n " "
echo
echo
Результат — в скрине в начале поста
Готовый скрипт
На GitHub
По мотивам
Как изменить цвет текста в терминале Linux