Подсвечивание текста в Bash

При выводе информации пользователю в командной строке, хорошей практикой является подсвечивание текста в зависимости от типа. К примеру, ошибки выводить красным текстом, предупреждения жёлтым, а успешные действия зелёным.

Для вывода текста в цвете будет использована команду tput. Изменение цвета достигается с помощью

tput setf N

где N=0-6 номер цвета по базе данных terminfo. Стандартные для значения:

  • 0 - Черный
  • 1 - Синий
  • 2 - Зеленый
  • 3 - Голубой
  • 4 - Красный
  • 5 - Пурпурный
  • 6 - Желтый
  • 7 - Белый

Но значения могу отличаться.

Изменение цвета фона достигается с помощью опции setb. Значение цветов такое же, как и у опции setf.

К примеру, для установки жёлтого текста необходимо выполнить

tput setf 6

После этого текст будет выделяться жёлтым. Для возврата в стандартное значение, необходимо выполнить

tput sgr0

А для установки белого фона и синего текста:

tput setf 1
tput setb 7

Теперь настало всё это оформить в виде функции, чтобы каждый раз не выводить руками.
Для этого можно использовать следующую функцию

notice()
{
        yellow=$(tput setf 6)
        red=$(tput setf 4)
        green=$(tput setf 2)
        reset=$(tput sgr0)
        toend=$(tput hpa $(tput cols))$(tput cub 6)

        case "$2" in
                "success")
                        echo -n "${green}${1}"
                        ;;
                "error")
                        echo -n "${red}${1}"
                        ;;
                *)
                        echo -n "${yellow}${1}"
                        ;;

        esac

        echo -n "${reset}"
        echo
}

В начале происходит установка переменных с цветами для более удобной работы, далее на основе переданного второго аргумента, выводится текст, который передаётся первым аргументов, в нужном цвете. В конце мы сбрасывает до стандартного значения.

Использовать функцию в скрипте можно следующим образом:

notice "text" "type"

К примеру, вывод информации об ошибке будет выглядеть следующим образом:

notice "Error!" "error"