Цветной текст в консоли #2
Мы уже красили консоль при помощи
tput
(копия), но есть лучший способ, при помощи эскейп-последовательностей, там немного сложнее и запутаннее синтаксис, но зато нормальная поддержка 16 цветов и стилей.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
Это репост с сайта http://tolik-punkoff.com
Оригинал: https://tolik-punkoff.com/2022/10/02/tsv