Цветной сценарий bash [duplicate]

Я хочу написать bash-скрипт, который печатает некоторую информацию в терминал STDOUT. Для лучшей читабельности и структуры я хотел бы выделить цветом различные элементы и выделить их таким образом.

Существует ли эквивалент Bash команде Windows-CMD/DOS COLOR, которая устанавливает текущий цвет фона и шрифта? И как мне вернуть цвет обратно к терминальному по умолчанию после завершения моего сценария?

Edit:
Я прочитал Pipable команда для цветной печати?, но только некоторые ответы написаны на Bash, чтобы их можно было легко включить в мой скрипт. Кроме того, в ответах отсутствуют следующие пункты, которые мне нужны:

  • изменить цвет фона
  • отображать белый цвет переднего плана, вместо него отображается цвет по умолчанию, установленный в gnome-terminal (для меня это неоново-зеленый)
  • как-то сделать доступными все имеющиеся цвета, а не только небольшое подмножество по ключевым словам. Я мог бы представить, например, какую-нибудь RGB-кодировку, которую можно было бы передавать в качестве аргумента функции для простого указания цвета.
1
задан 13 April 2017 в 15:23

2 ответа

Вы могли использовать tput

  • tput setaf <color>, выбирает основной цвет
  • tput setab <color>, выбирает цвет фона

, цвета составляют 1 бит b, g, r:

  0. black
  1. red
  2. green
  3. yellow
  4. blue
  5. magenta
  6. cyan
  7. white

tput может установить другие атрибуты символов, таких как подчеркивание, полужирное, мигание и т.д. см. man terminfo для получения дополнительной информации.

я думаю, что хороший способ использовать это путем установки переменных shemantically. т.е.

startheader=`tput setaf 0``tput setab 7`
endheader=`tput sgr0`
startprompt=`tput bold`
endprompt=$endheader

echo ${startheader}The Header${endheader}
echo -n ${startprompt}Enter value: ${endprompt}
read value
0
ответ дан 7 December 2019 в 13:53

Маленький сценарий для получения загадочных кодов ;)

#!/bin/bash
#
#   This file echoes a bunch of color codes to the 
#   terminal to demonstrate what's available.  Each 
#   line is the color code of one forground color,
#   out of 17 (default + 16 escapes), followed by a 
#   test use of that color on all nine background 
#   colors (default + 8 escapes).
#

T='gYw'   # The test text

echo -e "\n                 40m     41m     42m     43m\
     44m     45m     46m     47m";

for FGs in '    m' '   1m' '  30m' '1;30m' '  31m' '1;31m' '  32m' \
           '1;32m' '  33m' '1;33m' '  34m' '1;34m' '  35m' '1;35m' \
           '  36m' '1;36m' '  37m' '1;37m';
  do FG=${FGs// /}
  echo -en " $FGs \033[$FG  $T  "
  for BG in 40m 41m 42m 43m 44m 45m 46m 47m;
    do echo -en "$EINS \033[$FG\033[$BG  $T  \033[0m";
  done
  echo;
done
echo

enter image description here


Код легко прочитать из таблицы, которая генерировала предыдущий сценарий.

\e[1;37m\e[44m

  • \e[1;37m – Передний план

  • \e[44m – Фон


Некоторые примеры

  • Белый передний план

    TOA="\e[0m" # No Color
    whiteForeground="\e[1;37m" 
    echo -e "${whiteForeground}foo${TOA}"
    
  • Белый на синем

    TOA="\e[0m" # No Color
    whiteOnBlue="\e[1;37m\e[44m" 
    echo -e "${whiteOnBlue}foo${TOA}"
    

И демонстрационный сценарий удара:

red="\e[0;31m"
green="\e[0;32m"
yellow="\e[0;33m"
blue="\e[0;34m"
TOA="\e[0m" # No Color

if [[ $cfg_log_level == "" ]]; then
  cfg_log_level=4
fi

function logError () {
  if [[ $cfg_log_level == "1" ]] || [[ $cfg_log_level == "2" ]] || [[ $cfg_log_level == "3" ]] || [[ $cfg_log_level == "4" ]]; then
    echo -e "${red}$1${TOA}" 1>&2
  fi
}

function logWarn () {
  if [[ $cfg_log_level == "2" ]] || [[ $cfg_log_level == "3" ]] || [[ $cfg_log_level == "4" ]]; then
    echo -e "${yellow}$1${TOA}" 1>&2
  fi
}

function logInfo () {
  if [[ $cfg_log_level == "3" ]] || [[ $cfg_log_level == "4" ]]; then
    echo -e "${green}$1${TOA}" 1>&2
  fi
}

function logDebug () {
  if [[ $cfg_log_level == "4" ]]; then
    echo -e "${blue}$1${TOA}" 1>&2
  fi
}
2
ответ дан 7 December 2019 в 13:53

Другие вопросы по тегам:

Похожие вопросы: