2098

I am trying to print a text in the terminal using echo command.

I want to print the text in a red color. How can I do that?

whackamadoodle3000
  • 6,185
  • 4
  • 21
  • 38
satheesh.droid
  • 24,169
  • 8
  • 32
  • 33

31 Answers31

2746

You can use these ANSI escape codes:

Black        0;30     Dark Gray     1;30
Red          0;31     Light Red     1;31
Green        0;32     Light Green   1;32
Brown/Orange 0;33     Yellow        1;33
Blue         0;34     Light Blue    1;34
Purple       0;35     Light Purple  1;35
Cyan         0;36     Light Cyan    1;36
Light Gray   0;37     White         1;37

And then use them like this in your script:

#    .---------- constant part!
#    vvvv vvvv-- the code from above
RED='\033[0;31m'
NC='\033[0m' # No Color
printf "I ${RED}love${NC} Stack Overflow\n"

which prints love in red.

From @james-lim's comment, if you are using the echo command, be sure to use the -e flag to allow backslash escapes.

# Continued from above example
echo -e "I ${RED}love${NC} Stack Overflow"

(don't add "\n" when using echo unless you want to add an additional empty line)

Dan Nestor
  • 2,270
  • 1
  • 20
  • 40
Tobias
  • 27,992
  • 1
  • 16
  • 23
  • 16
    Doesn't work for me -- output: `\e[0;31mHello Stackoverflow\e[0m` – Ben Harold May 09 '13 at 22:01
  • 187
    Did you try it with "-e"? It tells `echo` to enable backslash escapes. – James Lim May 14 '13 at 13:10
  • 153
    In MacOSX, using `\x1B` instead of `\e`. `\033` would be ok for all platforms. – Xiao Jun 19 '13 at 06:04
  • 5
    In an ant property file use unicode for the esacpe, e.g. red=\u001b[0;31m – shonky linux user Oct 01 '13 at 00:55
  • 1
    You might note that these do depend on the terminal understanding them. That said, I've never met a terminal that doesn't understand this set. The `0` means "reset"; it isn't strictly required (only if you need a reset), and would be just as valid in the bright versions. (`0;1;30`) (`1` means bright.) – Thanatos Mar 23 '14 at 20:56
  • 3
    On my system (bash on ubuntu) I found that for the first number, 1 means bold not bright, and 3 and 4 are italic and underlined, 5 flashes, and 7 changes the background as well. I wonder if there's some sort of specification for these somewhere? – Benubird Jul 24 '14 at 08:57
  • 24
    Like msanford made for tput, here is the "ANSI-Rainbow" `for (( i = 30; i < 38; i++ )); do echo -e "\033[0;"$i"m Normal: (0;$i); \033[1;"$i"m Light: (1;$i)"; done` – everyman Jan 28 '16 at 21:28
  • 2
    `echo -e` is not portable while `printf` is. Use `printf`. – tripleee Apr 07 '17 at 05:55
  • you may need to do `\x33` instead of `\033` (same but octal prefix doesn't work in coffeescript for instance) – localhostdotdev May 13 '19 at 01:02
  • 1
    You must use double quotes with `echo` for this to work. – Chiramisu Jan 08 '20 at 17:01
  • @everyman you forgot escape ANSI coloring at the end of loop, Sherlock ;) – biesior Aug 24 '20 at 23:30
  • Just a heads up for anyone using the popular IDEA series of IDEs, the black/white/gray color codes will look a little jumbled (light gray is darker than dark gray for instance) if you use them in the in-IDE output console, but they do output to an actual terminal correctly – adavea Dec 08 '20 at 15:00
  • You can pre-expand the escapes like so `(printf -v R '\e[0;31m'; printf -v Z '\e[0m'; echo "This is a ${R}red$Z word.")`. Then you can use them in a plain echo without `-e` (and even without the double quotes). – ingydotnet Feb 01 '21 at 19:33
  • for default color what code do i need to use? – aswzen Apr 14 '21 at 09:46
1135

You can use the awesome tput command (suggested in Ignacio's answer) to produce terminal control codes for all kinds of things.


Usage

Specific tput sub-commands are discussed later.

Direct

Call tput as part of a sequence of commands:

tput setaf 1; echo "this is red text"

Use ; instead of && so if tput errors the text still shows.

Shell variables

Another option is to use shell variables:

red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
echo "${red}red text ${green}green text${reset}"

tput produces character sequences that are interpreted by the terminal as having a special meaning. They will not be shown themselves. Note that they can still be saved into files or processed as input by programs other than the terminal.

Command substitution

It may be more convenient to insert tput's output directly into your echo strings using command substitution:

echo "$(tput setaf 1)Red text $(tput setab 7)and white background$(tput sgr 0)"

Example

The above command produces this on Ubuntu:

Screenshot of colour terminal text


Foreground & background colour commands

tput setab [1-7] # Set the background colour using ANSI escape
tput setaf [1-7] # Set the foreground colour using ANSI escape

Colours are as follows:

Num  Colour    #define         R G B

0    black     COLOR_BLACK     0,0,0
1    red       COLOR_RED       1,0,0
2    green     COLOR_GREEN     0,1,0
3    yellow    COLOR_YELLOW    1,1,0
4    blue      COLOR_BLUE      0,0,1
5    magenta   COLOR_MAGENTA   1,0,1
6    cyan      COLOR_CYAN      0,1,1
7    white     COLOR_WHITE     1,1,1

There are also non-ANSI versions of the colour setting functions (setb instead of setab, and setf instead of setaf) which use different numbers, not given here.

Text mode commands

tput bold    # Select bold mode
tput dim     # Select dim (half-bright) mode
tput smul    # Enable underline mode
tput rmul    # Disable underline mode
tput rev     # Turn on reverse video mode
tput smso    # Enter standout (bold) mode
tput rmso    # Exit standout mode

Cursor movement commands

tput cup Y X # Move cursor to screen postion X,Y (top left is 0,0)
tput cuf N   # Move N characters forward (right)
tput cub N   # Move N characters back (left)
tput cuu N   # Move N lines up
tput ll      # Move to last line, first column (if no cup)
tput sc      # Save the cursor position
tput rc      # Restore the cursor position
tput lines   # Output the number of lines of the terminal
tput cols    # Output the number of columns of the terminal

Clear and insert commands

tput ech N   # Erase N characters
tput clear   # Clear screen and move the cursor to 0,0
tput el 1    # Clear to beginning of line
tput el      # Clear to end of line
tput ed      # Clear to end of screen
tput ich N   # Insert N characters (moves rest of line forward!)
tput il N    # Insert N lines

Other commands

tput sgr0    # Reset text format to the terminal's default
tput bel     # Play a bell

With compiz wobbly windows, the bel command makes the terminal wobble for a second to draw the user's attention.


Scripts

tput accepts scripts containing one command per line, which are executed in order before tput exits.

Avoid temporary files by echoing a multiline string and piping it:

echo -e "setf 7\nsetb 1" | tput -S  # set fg white and bg red

See also

  • See man 1 tput
  • See man 5 terminfo for the complete list of commands and more details on these options. (The corresponding tput command is listed in the Cap-name column of the huge table that starts at line 81.)
doekman
  • 17,528
  • 19
  • 61
  • 80
Drew Noakes
  • 266,361
  • 143
  • 616
  • 705
  • 20
    Great answer. This is the one that helped me the most. For anyone else who was wondering what I was wondering, the `$()` is a [command substitution](http://tldp.org/LDP/abs/html/commandsub.html). All `tput af 1` does is generate the color code string, but the codes are not printable characters, so typing `tput af 1` alone will produce a blank line of output. – Chris Middleton Jul 25 '14 at 15:45
  • 5
    Note: if you are using CygWin and don't have tput install `ncurses` – Enrico Dec 12 '14 at 18:56
  • 3
    tput also works inside sed for parsing cruft into legible, colorful cruft: https://gist.github.com/nickboldt/fab71da10bd5169ffdfa – nickboldt Feb 05 '15 at 19:06
  • 1
    For a full list of the `tput` colours [check out this answer on the Unix StackExchange](http://unix.stackexchange.com/a/269085/207392) – Andrew Jan 21 '17 at 23:10
  • I think `reset=\`tput sgr0\`` should be `reset=\`tput sgr 0\``, with a space. – monkeypants Sep 24 '19 at 06:26
  • This option worked for me using the `fish` shell. Here's an example: `tput setaf 5` `tput bold` `echo "Hello, World"` `tput sgr0` – csalmeida Apr 10 '20 at 21:34
  • 1
    @monkeypants From [what I can see](https://man7.org/linux/man-pages/man5/terminfo.5.html) `sgr0` is specifically meant for resetting (turning off) the attributes. `sgr 0` can probably fulfill this role too, but `sgr` is a more general command allowing to change attributes. – x-yuri Dec 23 '20 at 15:46
1087

some variables that you can use:

# Reset
Color_Off='\033[0m'       # Text Reset

# Regular Colors
Black='\033[0;30m'        # Black
Red='\033[0;31m'          # Red
Green='\033[0;32m'        # Green
Yellow='\033[0;33m'       # Yellow
Blue='\033[0;34m'         # Blue
Purple='\033[0;35m'       # Purple
Cyan='\033[0;36m'         # Cyan
White='\033[0;37m'        # White

# Bold
BBlack='\033[1;30m'       # Black
BRed='\033[1;31m'         # Red
BGreen='\033[1;32m'       # Green
BYellow='\033[1;33m'      # Yellow
BBlue='\033[1;34m'        # Blue
BPurple='\033[1;35m'      # Purple
BCyan='\033[1;36m'        # Cyan
BWhite='\033[1;37m'       # White

# Underline
UBlack='\033[4;30m'       # Black
URed='\033[4;31m'         # Red
UGreen='\033[4;32m'       # Green
UYellow='\033[4;33m'      # Yellow
UBlue='\033[4;34m'        # Blue
UPurple='\033[4;35m'      # Purple
UCyan='\033[4;36m'        # Cyan
UWhite='\033[4;37m'       # White

# Background
On_Black='\033[40m'       # Black
On_Red='\033[41m'         # Red
On_Green='\033[42m'       # Green
On_Yellow='\033[43m'      # Yellow
On_Blue='\033[44m'        # Blue
On_Purple='\033[45m'      # Purple
On_Cyan='\033[46m'        # Cyan
On_White='\033[47m'       # White

# High Intensity
IBlack='\033[0;90m'       # Black
IRed='\033[0;91m'         # Red
IGreen='\033[0;92m'       # Green
IYellow='\033[0;93m'      # Yellow
IBlue='\033[0;94m'        # Blue
IPurple='\033[0;95m'      # Purple
ICyan='\033[0;96m'        # Cyan
IWhite='\033[0;97m'       # White

# Bold High Intensity
BIBlack='\033[1;90m'      # Black
BIRed='\033[1;91m'        # Red
BIGreen='\033[1;92m'      # Green
BIYellow='\033[1;93m'     # Yellow
BIBlue='\033[1;94m'       # Blue
BIPurple='\033[1;95m'     # Purple
BICyan='\033[1;96m'       # Cyan
BIWhite='\033[1;97m'      # White

# High Intensity backgrounds
On_IBlack='\033[0;100m'   # Black
On_IRed='\033[0;101m'     # Red
On_IGreen='\033[0;102m'   # Green
On_IYellow='\033[0;103m'  # Yellow
On_IBlue='\033[0;104m'    # Blue
On_IPurple='\033[0;105m'  # Purple
On_ICyan='\033[0;106m'    # Cyan
On_IWhite='\033[0;107m'   # White

the escape character in bash, hex and octal respectively:

|       | bash  | hex    | octal   | NOTE                         |
|-------+-------+--------+---------+------------------------------|
| start | \e    | \x1b   | \033    |                              |
| start | \E    | \x1B   | -       | x cannot be capital          |
| end   | \e[0m | \x1m0m | \033[0m |                              |
| end   | \e[m  | \x1b[m | \033[m  | 0 is appended if you omit it |
|       |       |        |         |                              |

short example:

| color       | bash         | hex            | octal          | NOTE                                  |
|-------------+--------------+----------------+----------------+---------------------------------------|
| start green | \e[32m<text> | \x1b[32m<text> | \033[32m<text> | m is NOT optional                     |
| reset       | <text>\e[0m  | <text>\1xb[0m  | <text>\033[om  | o is optional (do it as best practice |
|             |              |                |                |                                       |

bash exception:

If you are going to use these codes in your special bash variables

  • PS0
  • PS1
  • PS2 (= this is for prompting)
  • PS4

you should add extra escape characters so that can interpret them correctly. Without this adding extra escape characters it works but you will face problems when you use Ctrl + r for search in your history.

exception rule for bash

You should add \[ before any starting ANSI code and add \] after any ending ones.
Example:
in regular usage: \033[32mThis is in green\033[0m
for PS0/1/2/4: \[\033[32m\]This is in green\[\033[m\]

\[ is for start of a sequence of non-printable characters
\] is for end of a sequence of non-printable characters

Tip: for memorize it you can first add \[\] and then put your ANSI code between them:

  • \[start-ANSI-code\]
  • \[end-ANSI-code\]

type of color sequence:

  1. 3/4 bit
  2. 8 bit
  3. 24 bit

Before diving into these colors, you should know about 4 modes with these codes:

1. color-mode

It modifies the style of color NOT text. For example make the color bright or darker.

  • 0 reset
  • 1; lighter than normal
  • 2; darker than normal

This mode is not supported widely. It is fully support on Gnome-Terminal.

2. text-mode

This mode is for modifying the style of text NOT color.

  • 3; italic
  • 4; underline
  • 5; blinking (slow)
  • 6; blinking (fast)
  • 7; reverse
  • 8; hide
  • 9; cross-out

and are almost supported.
For example KDE-Konsole supports 5; but Gnome-Terminal does not and Gnome supports 8; but KDE does not.

3. foreground mode

This mode is for colorizing the foreground.

4. background mode

This mode is for colorizing the background.

The below table shows a summary of 3/4 bit version of ANSI-color

|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
| color-mode | octal    | hex     | bash  | description      | example (= in octal)         | NOTE                                 |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|          0 | \033[0m  | \x1b[0m | \e[0m | reset any affect | echo -e "\033[0m"            | 0m equals to m                       |
|          1 | \033[1m  |         |       | light (= bright) | echo -e "\033[1m####\033[m"  | -                                    |
|          2 | \033[2m  |         |       | dark (= fade)    | echo -e "\033[2m####\033[m"  | -                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|  text-mode | ~        |         |       | ~                | ~                            | ~                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|          3 | \033[3m  |         |       | italic           | echo -e "\033[3m####\033[m"  |                                      |
|          4 | \033[4m  |         |       | underline        | echo -e "\033[4m####\033[m"  |                                      |
|          5 | \033[5m  |         |       | blink (slow)     | echo -e "\033[3m####\033[m"  |                                      |
|          6 | \033[6m  |         |       | blink (fast)     | ?                            | not wildly support                   |
|          7 | \003[7m  |         |       | reverse          | echo -e "\033[7m####\033[m"  | it affects the background/foreground |
|          8 | \033[8m  |         |       | hide             | echo -e "\033[8m####\033[m"  | it affects the background/foreground |
|          9 | \033[9m  |         |       | cross            | echo -e "\033[9m####\033[m"  |                                      |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
| foreground | ~        |         |       | ~                | ~                            | ~                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         30 | \033[30m |         |       | black            | echo -e "\033[30m####\033[m" |                                      |
|         31 | \033[31m |         |       | red              | echo -e "\033[31m####\033[m" |                                      |
|         32 | \033[32m |         |       | green            | echo -e "\033[32m####\033[m" |                                      |
|         33 | \033[33m |         |       | yellow           | echo -e "\033[33m####\033[m" |                                      |
|         34 | \033[34m |         |       | blue             | echo -e "\033[34m####\033[m" |                                      |
|         35 | \033[35m |         |       | purple           | echo -e "\033[35m####\033[m" | real name: magenta = reddish-purple  |
|         36 | \033[36m |         |       | cyan             | echo -e "\033[36m####\033[m" |                                      |
|         37 | \033[37m |         |       | white            | echo -e "\033[37m####\033[m" |                                      |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         38 | 8/24     |                    This is for special use of 8-bit or 24-bit                                            |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
| background | ~        |         |       | ~                | ~                            | ~                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         40 | \033[40m |         |       | black            | echo -e "\033[40m####\033[m" |                                      |
|         41 | \033[41m |         |       | red              | echo -e "\033[41m####\033[m" |                                      |
|         42 | \033[42m |         |       | green            | echo -e "\033[42m####\033[m" |                                      |
|         43 | \033[43m |         |       | yellow           | echo -e "\033[43m####\033[m" |                                      |
|         44 | \033[44m |         |       | blue             | echo -e "\033[44m####\033[m" |                                      |
|         45 | \033[45m |         |       | purple           | echo -e "\033[45m####\033[m" | real name: magenta = reddish-purple  |
|         46 | \033[46m |         |       | cyan             | echo -e "\033[46m####\033[m" |                                      |
|         47 | \033[47m |         |       | white            | echo -e "\033[47m####\033[m" |                                      |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         48 | 8/24     |                    This is for special use of 8-bit or 24-bit                                            |                                                                                       |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|

The below table shows a summary of 8 bit version of ANSI-color

|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
| foreground | octal     | hex       | bash    | description      | example                            | NOTE                    |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
|        0-7 | \033[38;5 | \x1b[38;5 | \e[38;5 | standard. normal | echo -e '\033[38;5;1m####\033[m'   |                         |
|       8-15 |           |           |         | standard. light  | echo -e '\033[38;5;9m####\033[m'   |                         |
|     16-231 |           |           |         | more resolution  | echo -e '\033[38;5;45m####\033[m'  | has no specific pattern |
|    232-255 |           |           |         |                  | echo -e '\033[38;5;242m####\033[m' | from black to white     |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
| foreground | octal     | hex       | bash    | description      | example                            | NOTE                    |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
|        0-7 |           |           |         | standard. normal | echo -e '\033[48;5;1m####\033[m'   |                         |
|       8-15 |           |           |         | standard. light  | echo -e '\033[48;5;9m####\033[m'   |                         |
|     16-231 |           |           |         | more resolution  | echo -e '\033[48;5;45m####\033[m'  |                         |
|    232-255 |           |           |         |                  | echo -e '\033[48;5;242m####\033[m' | from black to white     |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|

The 8-bit fast test:
for code in {0..255}; do echo -e "\e[38;05;${code}m $code: Test"; done

The below table shows a summary of 24 bit version of ANSI-color

|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
| foreground | octal     | hex       | bash    | description | example                                  | NOTE            |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
|      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | R = red     | echo -e '\033[38;2;255;0;02m####\033[m'  | R=255, G=0, B=0 |
|      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | G = green   | echo -e '\033[38;2;;0;255;02m####\033[m' | R=0, G=255, B=0 |
|      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | B = blue    | echo -e '\033[38;2;0;0;2552m####\033[m'  | R=0, G=0, B=255 |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
| background | octal     | hex       | bash    | description | example                                  | NOTE            |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
|      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | R = red     | echo -e '\033[48;2;255;0;02m####\033[m'  | R=255, G=0, B=0 |
|      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | G = green   | echo -e '\033[48;2;;0;255;02m####\033[m' | R=0, G=255, B=0 |
|      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | B = blue    | echo -e '\033[48;2;0;0;2552m####\033[m'  | R=0, G=0, B=255 |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|

some screen-shots

foreground 8-bit summary in a .gif

foreground.gif

background 8-bit summary in a .gif

background.gif

color summary with their values

enter image description here enter image description here enter image description here enter image description here

blinking on KDE-Terminal

KDE-blinking

a simple `C` code that shows you more

cecho_screenshot

a more advanced tool that I developed to deal with these colors:

bline


color-mode shot

fade-normal-bright

text mode shot

only-text-mode

combining is OK

combine

more shots


Tips and Tricks for Advanced Users and Programmers:

Can we use these codes in a programming language?

Yes, you can. I experienced in , , , ,

Do they slow down the speed of a program?

I think, NO.

Can we use these on Windows?

3/4-bit Yes, if you compile the code with gcc
some screen-shots on Win-7

How to calculate the length of code?

\033[ = 2, other parts 1

Where can we use these codes?

Anywhere that has a tty interpreter
xterm, gnome-terminal, kde-terminal, mysql-client-CLI and so on.
For example if you want to colorize your output with mysql you can use Perl

#!/usr/bin/perl -n
print "\033[1m\033[31m$1\033[36m$2\033[32m$3\033[33m$4\033[m" while /([|+-]+)|([0-9]+)|([a-zA-Z_]+)|([^\w])/g;

store this code in a file name: pcc (= Perl Colorize Character) and then put the file a in valid PATH then use it anywhere you like.

ls | pcc
df | pcc

inside mysql first register it for pager and then try:

[user2:db2] pager pcc
PAGER set to 'pcc'
[user2:db2] select * from table-name;

pcc

It does NOT handle Unicode.

Do these codes only do colorizing?

No, they can do a lot of interesting things. Try:

echo -e '\033[2K'  # clear the screen and do not move the position

or:

echo -e '\033[2J\033[u' # clear the screen and reset the position

There are a lot of beginners that want to clear the screen with system( "clear" ) so you can use this instead of system(3) call

Are they available in Unicode?

Yes. \u001b

Which version of these colors is preferable?

It is easy to use 3/4-bit, but it is much accurate and beautiful to use 24-bit.
If you do not have experience with so here is a quick tutorial:
24 bits means: 00000000 and 00000000 and 00000000. Each 8-bit is for a specific color.
1..8 is for and 9..16 for and 17..24 for
So in #FF0000 means and here it is: 255;0;0
in #00FF00 means which here is: 0;255;0
Does that make sense? what color you want combine it with these three 8-bit values.


reference:
Wikipedia
ANSI escape sequences
tldp.org
tldp.org
misc.flogisoft.com
some blogs/web-pages that I do not remember

Pang
  • 8,605
  • 144
  • 77
  • 113
Shakiba Moshiri
  • 13,741
  • 2
  • 20
  • 35
  • 133
    Is no one else truly amazed at this answer?? – Benj May 14 '19 at 12:08
  • This helped me get around .eslint strict, no octal literals, and at the same time to overcome JS template strings not allowing the same. – Neil Guy Lindberg Oct 02 '19 at 20:17
  • 2
    @NeilGuyLindberg **no octal literals** this error is part of Node.js not eslist itself. you can use `x1B[` for eliminate it. – Shakiba Moshiri Oct 03 '19 at 06:45
  • 3
    Feels like, @ShakibaMoshiri wrote a thesis on this topic xD Jokes apart, cheers for such a detailed answer! – SH' Dec 05 '19 at 15:22
  • 1
    I came here to learn how you did this great HR like lines with images! Very nice and thnk you! – Worker Mar 27 '20 at 13:26
  • 1
    Waow, awesome! :-D I just did a quite nice function extremely easy to use, so I've to share it ;-) https://github.com/ppo/bash-colors – Pascal Polleunus Apr 04 '20 at 09:54
  • 1
    @ShakibaMoshiri It's not clear from answer how to combine colors until you carefully read [ANSI escape sequences](http://ascii-table.com/ansi-escape-sequences.php). Just for note: `echo -e "\033[97;44;1m text \033[m"` will output bold (;1) white color text (;97) on the blue background (;44), and `\033[0m` reset all text attribute (0). Also it depend on a color schema of terminal. – victorq10 Apr 23 '20 at 12:39
  • 1
    Best answer of the Internet regarding colours. Thanks again, 5 years after the original post. – Aziule Jul 23 '20 at 21:49
  • 1
    Give this person a cookie! POGCHAMP @Shakiba Moshiri – Vasil Aug 29 '20 at 10:40
212

Use tput with the setaf capability and a parameter of 1.

echo "$(tput setaf 1)Hello, world$(tput sgr0)"
Ignacio Vazquez-Abrams
  • 699,552
  • 132
  • 1,235
  • 1,283
  • 10
    This should be the best option. what _tput_ does is it will read the terminal info and render the correctly escaped ANSI code for you. code like `\033[31m` will break the _readline_ library in some of the terminals. – Tian Chen Mar 06 '13 at 07:39
  • 49
    Explore colours with a simple loop (increase `i`'s upper bound for more shades): `for (( i = 0; i < 17; i++ )); do echo "$(tput setaf $i)This is ($i) $(tput sgr0)"; done` – msanford Jan 22 '14 at 15:41
  • 3
    Here is a HOWTO on the tput codes: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html – maxywb Aug 04 '14 at 18:38
  • Agree with @TianChen, code like `\033[31m`will also produce some non relevant characters when the program used to output text is not compatible with such commands. In the other hand, `tput + setaf`commands won't, leaving the output fully readable. See @BenHarold 's comment, saying : "Doesn't work for me -- output: `\e[0;31mHello Stackoverflow\e[0m`" – el-teedee Oct 05 '20 at 10:42
162
echo -e "\033[31m Hello World"

The [31m controls the text color:

  • 30-37 sets foreground color
  • 40-47 sets background color

A more complete list of color codes can be found here.

It is good practice to reset the text color back to \033[0m at the end of the string.

Frank Nocke
  • 7,493
  • 3
  • 58
  • 89
neocanable
  • 4,763
  • 2
  • 21
  • 28
43

I have just amalgamated the good catches in all solutions and ended up with:

cecho(){
    RED="\033[0;31m"
    GREEN="\033[0;32m"
    YELLOW="\033[1;33m"
    # ... ADD MORE COLORS
    NC="\033[0m" # No Color

    printf "${!1}${2} ${NC}\n"
}

And you can just call it as:

cecho "RED" "Helloworld"
Andrew Schwartz
  • 3,722
  • 2
  • 21
  • 46
Andrew Naguib
  • 3,978
  • 2
  • 21
  • 42
34

This is the color switch \033[. See history.

Color codes are like 1;32 (Light Green), 0;34 (Blue), 1;34 (Light Blue), etc.

We terminate color sequences with a color switch \033[ and 0m, the no-color code. Just like opening and closing tabs in a markup language.

  SWITCH="\033["
  NORMAL="${SWITCH}0m"
  YELLOW="${SWITCH}1;33m"
  echo "${YELLOW}hello, yellow${NORMAL}"

Simple color echo function solution:

cecho() {
  local code="\033["
  case "$1" in
    black  | bk) color="${code}0;30m";;
    red    |  r) color="${code}1;31m";;
    green  |  g) color="${code}1;32m";;
    yellow |  y) color="${code}1;33m";;
    blue   |  b) color="${code}1;34m";;
    purple |  p) color="${code}1;35m";;
    cyan   |  c) color="${code}1;36m";;
    gray   | gr) color="${code}0;37m";;
    *) local text="$1"
  esac
  [ -z "$text" ] && local text="$color$2${code}0m"
  echo "$text"
}

cecho "Normal"
cecho y "Yellow!"
Community
  • 1
  • 1
Jorge Bucaran
  • 5,124
  • 1
  • 26
  • 46
  • 1
    I'd change the last `text` variable by `text="$color${@: 2}${code}0m"` this way the whole line except the color parameter will be colored. – Shairon Toledo Oct 01 '15 at 15:02
  • @tomazahlin just add -e to echo, as several times mentioned above – Artem Medvedev Mar 21 '17 at 04:03
  • As Wilfred Hughes has suggested, it's better to use `tput` as it's more portable - works in Bash on macOS too. Therefore I actually suggest to use Alireza Mirian's function from this answer: https://stackoverflow.com/a/23006365/2693875 – Greg Dubicki Jun 07 '20 at 18:17
32

A neat way to change color only for one echo is to define such function:

function coloredEcho(){
    local exp=$1;
    local color=$2;
    if ! [[ $color =~ '^[0-9]$' ]] ; then
       case $(echo $color | tr '[:upper:]' '[:lower:]') in
        black) color=0 ;;
        red) color=1 ;;
        green) color=2 ;;
        yellow) color=3 ;;
        blue) color=4 ;;
        magenta) color=5 ;;
        cyan) color=6 ;;
        white|*) color=7 ;; # white or invalid color
       esac
    fi
    tput setaf $color;
    echo $exp;
    tput sgr0;
}

Usage:

coloredEcho "This text is green" green

Or you could directly use color codes mentioned in Drew's answer:

coloredEcho "This text is green" 2
Community
  • 1
  • 1
Alireza Mirian
  • 3,995
  • 2
  • 23
  • 45
  • If you add `-n` to echo then you can use it as inline coloring `echo "Red \`coloredEcho "fox" red\` jumps over the lazy dog"` – sobi3ch Jan 12 '17 at 17:23
29

Use tput to calculate color codes. Avoid using the ANSI escape code (e.g. \E[31;1m for red) because it's less portable. Bash on OS X, for example, does not support it.

BLACK=`tput setaf 0`
RED=`tput setaf 1`
GREEN=`tput setaf 2`
YELLOW=`tput setaf 3`
BLUE=`tput setaf 4`
MAGENTA=`tput setaf 5`
CYAN=`tput setaf 6`
WHITE=`tput setaf 7`

BOLD=`tput bold`
RESET=`tput sgr0`

echo -e "hello ${RED}some red text${RESET} world"
Wilfred Hughes
  • 26,027
  • 13
  • 120
  • 177
25

I found Shakiba Moshiri's awesome answer while I was looking info on that topic… then I had an idea… and it ended up in a quite nice function extremely easy to use
So I've to share it

https://github.com/ppo/bash-colors

Usage: $(c <flags>) inside an echo -e or printf

 ┌───────┬─────────────────┬──────────┐   ┌───────┬─────────────────┬──────────┐
 │ Code  │ Style           │ Octal    │   │ Code  │ Style           │ Octal    │
 ├───────┼─────────────────┼──────────┤   ├───────┼─────────────────┼──────────┤
 │   -   │ Foreground      │ \033[3.. │   │   B   │ Bold            │ \033[1m  │
 │   _   │ Background      │ \033[4.. │   │   U   │ Underline       │ \033[4m  │
 ├───────┼─────────────────┼──────────┤   │   F   │ Flash/blink     │ \033[5m  │
 │   k   │ Black           │ ......0m │   │   N   │ Negative        │ \033[7m  │
 │   r   │ Red             │ ......1m │   ├───────┼─────────────────┼──────────┤
 │   g   │ Green           │ ......2m │   │   L   │ Normal (unbold) │ \033[22m │
 │   y   │ Yellow          │ ......3m │   │   0   │ Reset           │ \033[0m  │
 │   b   │ Blue            │ ......4m │   └───────┴─────────────────┴──────────┘
 │   m   │ Magenta         │ ......5m │
 │   c   │ Cyan            │ ......6m │
 │   w   │ White           │ ......7m │
 └───────┴─────────────────┴──────────┘

Examples:

echo -e "$(c 0wB)Bold white$(c) and normal"
echo -e "Normal text… $(c r_yB)BOLD red text on yellow background… $(c _w)now on
  white background… $(c 0U) reset and underline… $(c) and back to normal."
Pascal Polleunus
  • 2,166
  • 2
  • 24
  • 27
25

My riff on Tobias' answer:

# Color
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # No Color

function red {
    printf "${RED}$@${NC}\n"
}

function green {
    printf "${GREEN}$@${NC}\n"
}

function yellow {
    printf "${YELLOW}$@${NC}\n"
}

$ echo $(red apple) $(yellow banana) $(green kiwi)
apple banana kiwi

wytten
  • 2,111
  • 1
  • 18
  • 33
20

This question has been answered over and over again :-) but why not.

First using tput is more portable in modern environments than manually injecting ASCII codes through echo -E

Here's a quick bash function:

 say() {
     echo "$@" | sed \
             -e "s/\(\(@\(red\|green\|yellow\|blue\|magenta\|cyan\|white\|reset\|b\|u\)\)\+\)[[]\{2\}\(.*\)[]]\{2\}/\1\4@reset/g" \
             -e "s/@red/$(tput setaf 1)/g" \
             -e "s/@green/$(tput setaf 2)/g" \
             -e "s/@yellow/$(tput setaf 3)/g" \
             -e "s/@blue/$(tput setaf 4)/g" \
             -e "s/@magenta/$(tput setaf 5)/g" \
             -e "s/@cyan/$(tput setaf 6)/g" \
             -e "s/@white/$(tput setaf 7)/g" \
             -e "s/@reset/$(tput sgr0)/g" \
             -e "s/@b/$(tput bold)/g" \
             -e "s/@u/$(tput sgr 0 1)/g"
  }

Now you can use:

 say @b@green[[Success]] 

to get:

Bold-Green Success

Notes on portability of tput

First time tput(1) source code was uploaded in September 1986

tput(1) has been available in X/Open curses semantics in 1990s (1997 standard has the semantics mentioned below).

So, it's (quite) ubiquitous.

Ahmed Masud
  • 19,014
  • 3
  • 28
  • 53
  • This is pretty cool! Didn't know this. Can you say something about the availability of `tput`? Is it available on most servers where one doesn't have admin rights to install it? Do you have a link to where this technique was first 'invented'? – Redsandro Oct 05 '17 at 08:15
  • 3
    tput is the standards compliant way to do this, where it's completely independent of you knowing the terminal capabilities. If the terminal does not support a given capability it will downgrade gracefully to whatever it can do without pushing out screwy escape codes. – Ahmed Masud Oct 05 '17 at 18:44
  • 1
    I have stopped using this method as it messes with the cursor position in bash lines. It will randomly wrap before the end of the line, and won't go back all the way to the beginning of the line when using home or the arrow keys. Going back to the clumsy manual escape codes fixes this problem. – Redsandro Oct 22 '17 at 12:47
  • 2
    @Resandro - is that because you're using it in `$PS1` without `\[...\]` around the non-spacing parts? Continue to use the Bash PS1 markers with the tput strings. – Toby Speight Mar 07 '18 at 16:40
  • Note that this function does not fully work on MacOsX because of differencies in the sed utility: https://unix.stackexchange.com/questions/13711/differences-between-sed-on-mac-osx-and-other-standard-sed – Jeff Oct 15 '18 at 13:41
  • @Jeff I was kinda hoping that OP would learn from the approach rather than blindly cutting and pasting it. The only reason I brought up `tput` as a portable approach is because it really *is* the correct way to query the terminal – Ahmed Masud Oct 15 '18 at 17:06
  • 1
    We can set the cursor position, line and column, using a similar ansi escape sequence. – NVRM Sep 04 '20 at 21:33
17

If you are using zsh or bash

black() {
    echo -e "\e[30m${1}\e[0m"
}

red() {
    echo -e "\e[31m${1}\e[0m"
}

green() {
    echo -e "\e[32m${1}\e[0m"
}

yellow() {
    echo -e "\e[33m${1}\e[0m"
}

blue() {
    echo -e "\e[34m${1}\e[0m"
}

magenta() {
    echo -e "\e[35m${1}\e[0m"
}

cyan() {
    echo -e "\e[36m${1}\e[0m"
}

gray() {
    echo -e "\e[90m${1}\e[0m"
}

black 'BLACK'
red 'RED'
green 'GREEN'
yellow 'YELLOW'
blue 'BLUE'
magenta 'MAGENTA'
cyan 'CYAN'
gray 'GRAY'

Try online

Vishal
  • 17,727
  • 17
  • 72
  • 91
16

We can use 24 Bits RGB true colors for both text and background!

 ESC[38;2;⟨r⟩;⟨g⟩;⟨b⟩m  /*Foreground color*/
 ESC[48;2;⟨r⟩;⟨g⟩;⟨b⟩m  /*Background color*/

Example red text and closing tag:

 echo -e "\e[38;2;255;0;0mHello world\e[0m"

Generator:

text.addEventListener("input",update)
back.addEventListener("input",update)

function update(){
  let a = text.value.substr(1).match(/.{1,2}/g)
  let b = back.value.substr(1).match(/.{1,2}/g)
  out1.textContent = "echo -e \"\\" + `033[38;2;${parseInt(a[0],16)};${parseInt(a[1],16)};${parseInt(a[2],16)}mHello\"`
  out2.textContent = "echo -e \"\\" + `033[48;2;${parseInt(b[0],16)};${parseInt(b[1],16)};${parseInt(b[2],16)}mWorld!\"`
}
div {padding:1rem;font-size:larger}
TEXT COLOR: <input type="color" id="text" value="#23233">
<br><div id="out1"></div>
BACK COLOR: <input type="color" id="back" value="#FFFF00">
<br><div id="out2">

24-bit: As "true color" graphic cards with 16 to 24 bits of color became common, Xterm,KDE's Konsole, as well as all libvte based terminals (including GNOME Terminal) support 24-bit foreground and background color setting https://en.wikipedia.org/wiki/ANSI_escape_code#24-bit

Is it safe to use in my scripts?

Yes! 8 and 16 bits terminals will just display as fallback a color on the range of the available palette, keeping the best contrast, no breakages!


Also, nobody noticed the usefulness of the ANSI code 7 reversed video.

It stay readable on any terminal schemes colors, black or white backgrounds, or other fancies palettes, by swapping foreground and background colors.

Example, for a red background that works everywhere:

echo -e "\033[31;7mHello world\e[0m";

This is how it looks when changing the terminal built-in schemes:

enter image description here

This is the loop script used for the gif.

for i in {30..49};do echo -e "\033[$i;7mReversed color code $i\e[0m Hello world!";done

See https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters

NVRM
  • 6,477
  • 1
  • 51
  • 60
14

Thanks to @k-five for this answer

declare -A colors
#curl www.bunlongheng.com/code/colors.png

# Reset
colors[Color_Off]='\033[0m'       # Text Reset

# Regular Colors
colors[Black]='\033[0;30m'        # Black
colors[Red]='\033[0;31m'          # Red
colors[Green]='\033[0;32m'        # Green
colors[Yellow]='\033[0;33m'       # Yellow
colors[Blue]='\033[0;34m'         # Blue
colors[Purple]='\033[0;35m'       # Purple
colors[Cyan]='\033[0;36m'         # Cyan
colors[White]='\033[0;37m'        # White

# Bold
colors[BBlack]='\033[1;30m'       # Black
colors[BRed]='\033[1;31m'         # Red
colors[BGreen]='\033[1;32m'       # Green
colors[BYellow]='\033[1;33m'      # Yellow
colors[BBlue]='\033[1;34m'        # Blue
colors[BPurple]='\033[1;35m'      # Purple
colors[BCyan]='\033[1;36m'        # Cyan
colors[BWhite]='\033[1;37m'       # White

# Underline
colors[UBlack]='\033[4;30m'       # Black
colors[URed]='\033[4;31m'         # Red
colors[UGreen]='\033[4;32m'       # Green
colors[UYellow]='\033[4;33m'      # Yellow
colors[UBlue]='\033[4;34m'        # Blue
colors[UPurple]='\033[4;35m'      # Purple
colors[UCyan]='\033[4;36m'        # Cyan
colors[UWhite]='\033[4;37m'       # White

# Background
colors[On_Black]='\033[40m'       # Black
colors[On_Red]='\033[41m'         # Red
colors[On_Green]='\033[42m'       # Green
colors[On_Yellow]='\033[43m'      # Yellow
colors[On_Blue]='\033[44m'        # Blue
colors[On_Purple]='\033[45m'      # Purple
colors[On_Cyan]='\033[46m'        # Cyan
colors[On_White]='\033[47m'       # White

# High Intensity
colors[IBlack]='\033[0;90m'       # Black
colors[IRed]='\033[0;91m'         # Red
colors[IGreen]='\033[0;92m'       # Green
colors[IYellow]='\033[0;93m'      # Yellow
colors[IBlue]='\033[0;94m'        # Blue
colors[IPurple]='\033[0;95m'      # Purple
colors[ICyan]='\033[0;96m'        # Cyan
colors[IWhite]='\033[0;97m'       # White

# Bold High Intensity
colors[BIBlack]='\033[1;90m'      # Black
colors[BIRed]='\033[1;91m'        # Red
colors[BIGreen]='\033[1;92m'      # Green
colors[BIYellow]='\033[1;93m'     # Yellow
colors[BIBlue]='\033[1;94m'       # Blue
colors[BIPurple]='\033[1;95m'     # Purple
colors[BICyan]='\033[1;96m'       # Cyan
colors[BIWhite]='\033[1;97m'      # White

# High Intensity backgrounds
colors[On_IBlack]='\033[0;100m'   # Black
colors[On_IRed]='\033[0;101m'     # Red
colors[On_IGreen]='\033[0;102m'   # Green
colors[On_IYellow]='\033[0;103m'  # Yellow
colors[On_IBlue]='\033[0;104m'    # Blue
colors[On_IPurple]='\033[0;105m'  # Purple
colors[On_ICyan]='\033[0;106m'    # Cyan
colors[On_IWhite]='\033[0;107m'   # White


color=${colors[$input_color]}
white=${colors[White]}
# echo $white



for i in "${!colors[@]}"
do
  echo -e "$i = ${colors[$i]}I love you$white"
done

Result

enter image description here

Hope this image help you to pick your color for your bash :D

Community
  • 1
  • 1
cyb3rZ
  • 43,853
  • 82
  • 251
  • 430
14

I instead of hard coding escape codes that are specific to your current terminal, you should use tput.

This is my favorite demo script:

#!/bin/bash

tput init

end=$(( $(tput colors)-1 ))
w=8
for c in $(seq 0 $end); do
    eval "$(printf "tput setaf %3s   " "$c")"; echo -n "$_"
    [[ $c -ge $(( w*2 )) ]] && offset=2 || offset=0
    [[ $(((c+offset) % (w-offset))) -eq $(((w-offset)-1)) ]] && echo
done

tput init

256 colors output by tput

Bruno Bronosky
  • 54,357
  • 9
  • 132
  • 120
13

These codes work on my Ubuntu box:

enter image description here

echo -e "\x1B[31m foobar \x1B[0m"
echo -e "\x1B[32m foobar \x1B[0m"
echo -e "\x1B[96m foobar \x1B[0m"
echo -e "\x1B[01;96m foobar \x1B[0m"
echo -e "\x1B[01;95m foobar \x1B[0m"
echo -e "\x1B[01;94m foobar \x1B[0m"
echo -e "\x1B[01;93m foobar \x1B[0m"
echo -e "\x1B[01;91m foobar \x1B[0m"
echo -e "\x1B[01;90m foobar \x1B[0m"
echo -e "\x1B[01;89m foobar \x1B[0m"
echo -e "\x1B[01;36m foobar \x1B[0m"

This prints the letters a b c d all in different colors:

echo -e "\x1B[0;93m a \x1B[0m b \x1B[0;92m c \x1B[0;93m d \x1B[0;94m"

For loop:

for (( i = 0; i < 17; i++ )); 
do echo "$(tput setaf $i)This is ($i) $(tput sgr0)"; 
done

enter image description here

Eric Leschinski
  • 123,728
  • 82
  • 382
  • 321
  • 2
    By the way: This does not depend much on having installed a specific version of ubuntu, but using PuTTY! – urzeit Jan 16 '15 at 14:50
12

For readability

If you want to improve the readability of the code, you can echo the string first then add the color later by using sed:

echo 'Hello World!' | sed $'s/World/\e[1m&\e[0m/' 
Community
  • 1
  • 1
Ooker
  • 1,012
  • 2
  • 15
  • 37
  • 1
    I really like this answer! Can you please explain the $ in the sed command though? – Patrick Mar 03 '16 at 23:35
  • 2
    The $'' is for bash, not sed. It tell bash to process the \e as an escape sequence, and put an "escape" character in. Usually you see the simpler forms like $'\t' or $'\n' to get a tab or newline character passed to a command. – dsz Oct 10 '16 at 04:28
9

My favourite answer so far is coloredEcho.

Just to post another option, you can check out this little tool xcol

https://ownyourbits.com/2017/01/23/colorize-your-stdout-with-xcol/

you use it just like grep, and it will colorize its stdin with a different color for each argument, for instance

sudo netstat -putan | xcol httpd sshd dnsmasq pulseaudio conky tor Telegram firefox "[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+" ":[[:digit:]]+" "tcp." "udp." LISTEN ESTABLISHED TIME_WAIT

xcol example

Note that it accepts any regular expression that sed will accept.

This tool uses the following definitions

#normal=$(tput sgr0)                      # normal text
normal=$'\e[0m'                           # (works better sometimes)
bold=$(tput bold)                         # make colors bold/bright
red="$bold$(tput setaf 1)"                # bright red text
green=$(tput setaf 2)                     # dim green text
fawn=$(tput setaf 3); beige="$fawn"       # dark yellow text
yellow="$bold$fawn"                       # bright yellow text
darkblue=$(tput setaf 4)                  # dim blue text
blue="$bold$darkblue"                     # bright blue text
purple=$(tput setaf 5); magenta="$purple" # magenta text
pink="$bold$purple"                       # bright magenta text
darkcyan=$(tput setaf 6)                  # dim cyan text
cyan="$bold$darkcyan"                     # bright cyan text
gray=$(tput setaf 7)                      # dim white text
darkgray="$bold"$(tput setaf 0)           # bold black = dark gray text
white="$bold$gray"                        # bright white text

I use these variables in my scripts like so

echo "${red}hello ${yellow}this is ${green}coloured${normal}"
nachoparker
  • 1,426
  • 15
  • 13
9

to show the message output with diffrent color you can make :

echo -e "\033[31;1mYour Message\033[0m"

-Black 0;30 Dark Gray 1;30

-Red 0;31 Light Red 1;31

-Green 0;32 Light Green 1;32

-Brown/Orange 0;33 Yellow 1;33

-Blue 0;34 Light Blue 1;34

-Purple 0;35 Light Purple 1;35

-Cyan 0;36 Light Cyan 1;36

-Light Gray 0;37 White 1;37

Amirouche Zeggagh
  • 2,532
  • 1
  • 17
  • 17
6

To expand on this answer, for the lazy of us:

function echocolor() { # $1 = string
    COLOR='\033[1;33m'
    NC='\033[0m'
    printf "${COLOR}$1${NC}\n"
}

echo "This won't be colored"
echocolor "This will be colorful"
Community
  • 1
  • 1
Mahn
  • 14,870
  • 12
  • 57
  • 77
  • 2
    Don't hardcode terminal escapes. Use `tput`; that's what it's for! – Toby Speight Sep 23 '15 at 16:25
  • @TobySpeight Although that may be true for multi-platform support (in theory), if poster finds it works in their own world, why disagree and dissuade others in similar world from using the technique? Case in point I'm trying similar in Ubuntu 16.04 bash and it works. As the only user on this platform I find this answer acceptable. I will also use `tput` for `sc` and `rc` though (save cursor, restore cursor). Although this answer calls me "lazy" it could be reworded as "practical" or "straight to the point". – WinEunuuchs2Unix Nov 02 '19 at 21:18
  • My own solution was similar to this, confined purely to shell built-ins, because forking two external processes,subshells etc. for every message in a script just had an...unpleasant smell. – Amit Naidu May 23 '20 at 04:47
6

You should definitely use tput over raw ANSI control sequences.

Because there's a large number of different terminal control languages, usually a system has an intermediate communication layer. The real codes are looked up in a database for the currently detected terminal type and you give standardized requests to an API or (from the shell) to a command.

One of these commands is tput . tput accepts a set of acronyms called capability names and any parameters, if appropriate, then looks up the correct escape sequences for the detected terminal in the terminfo database and prints the correct codes (the terminal hopefully understands).

from http://wiki.bash-hackers.org/scripting/terminalcodes

That said, I wrote a small helper library called bash-tint, which adds another layer on top of tput, making it even simpler to use (imho):

Example: tint "white(Cyan(T)Magenta(I)Yellow(N)Black(T)) is bold(really) easy to use."

Would give the following result: enter image description here

Toby Speight
  • 23,550
  • 47
  • 57
  • 84
ArtBIT
  • 3,575
  • 24
  • 39
6

I'm using this for color printing

#!/bin/bash
#--------------------------------------------------------------------+
#Color picker, usage: printf $BLD$CUR$RED$BBLU'Hello World!'$DEF     |
#-------------------------+--------------------------------+---------+
#       Text color        |       Background color         |         |
#-----------+-------------+--------------+-----------------+         |
# Base color|Lighter shade| Base color   | Lighter shade   |         |
#-----------+-------------+--------------+-----------------+         |
BLK='\e[30m'; blk='\e[90m'; BBLK='\e[40m'; bblk='\e[100m' #| Black   |
RED='\e[31m'; red='\e[91m'; BRED='\e[41m'; bred='\e[101m' #| Red     |
GRN='\e[32m'; grn='\e[92m'; BGRN='\e[42m'; bgrn='\e[102m' #| Green   |
YLW='\e[33m'; ylw='\e[93m'; BYLW='\e[43m'; bylw='\e[103m' #| Yellow  |
BLU='\e[34m'; blu='\e[94m'; BBLU='\e[44m'; bblu='\e[104m' #| Blue    |
MGN='\e[35m'; mgn='\e[95m'; BMGN='\e[45m'; bmgn='\e[105m' #| Magenta |
CYN='\e[36m'; cyn='\e[96m'; BCYN='\e[46m'; bcyn='\e[106m' #| Cyan    |
WHT='\e[37m'; wht='\e[97m'; BWHT='\e[47m'; bwht='\e[107m' #| White   |
#-------------------------{ Effects }----------------------+---------+
DEF='\e[0m'   #Default color and effects                             |
BLD='\e[1m'   #Bold\brighter                                         |
DIM='\e[2m'   #Dim\darker                                            |
CUR='\e[3m'   #Italic font                                           |
UND='\e[4m'   #Underline                                             |
INV='\e[7m'   #Inverted                                              |
COF='\e[?25l' #Cursor Off                                            |
CON='\e[?25h' #Cursor On                                             |
#------------------------{ Functions }-------------------------------+
# Text positioning, usage: XY 10 10 'Hello World!'                   |
XY () { printf "\e[$2;${1}H$3"; }                                   #|
# Print line, usage: line - 10 | line -= 20 | line 'Hello World!' 20 |
line () { printf -v _L %$2s; printf -- "${_L// /$1}"; }             #|
# Create sequence like {0..(X-1)}                                    |
que () { printf -v _N %$1s; _N=(${_N// / 1}); printf "${!_N[*]}"; } #|
#--------------------------------------------------------------------+

All basic colors set as vars and also there are some usefull functions: XY, line and que. Source this script in one of yours and use all color vars and functions.

Ivan
  • 3,695
  • 1
  • 10
  • 13
4

And this what I used to see all combination and decide which reads cool:

for (( i = 0; i < 8; i++ )); do
    for (( j = 0; j < 8; j++ )); do
        printf "$(tput setab $i)$(tput setaf $j)(b=$i, f=$j)$(tput sgr0)\n"
    done
done
tripleee
  • 139,311
  • 24
  • 207
  • 268
isntn
  • 1,106
  • 8
  • 21
2

I've written swag to achieve just that.

You can just do

pip install swag

Now you can install all the escape commands as txt files to a given destination via:

swag install -d <colorsdir>

Or even easier via:

swag install

Which will install the colors to ~/.colors.

Either you use them like this:

echo $(cat ~/.colors/blue.txt) This will be blue

Or this way, which I find actually more interesting:

swag print -c red -t underline "I will turn red and be underlined"

Check it out on asciinema!

HoldOffHunger
  • 10,963
  • 6
  • 53
  • 100
2

Inspired by @nachoparker's answer, I have this in my .bashrc:

#### colours
source xcol.sh

### tput foreground
export tpfn=$'\e[0m' # normal
export tpfb=$(tput bold)

## normal colours
export tpf0=$(tput setaf 0) # black
export tpf1=$(tput setaf 1) # red
export tpf2=$(tput setaf 2) # green
export tpf3=$(tput setaf 3) # yellow
export tpf4=$(tput setaf 4) # blue
export tpf5=$(tput setaf 5) # magenta
export tpf6=$(tput setaf 6) # cyan
export tpf7=$(tput setaf 7) # white
# echo "${tpf0}black ${tpf1}red ${tpf2}green ${tpf3}yellow ${tpf4}blue ${tpf5}magenta ${tpf6}cyan ${tpf7}white${tpfn}"

## bold colours
export tpf0b="$tpfb$tpf0" # bold black
export tpf1b="$tpfb$tpf1" # bold red
export tpf2b="$tpfb$tpf2" # bold green
export tpf3b="$tpfb$tpf3" # bold yellow
export tpf4b="$tpfb$tpf4" # bold blue
export tpf5b="$tpfb$tpf5" # bold magenta
export tpf6b="$tpfb$tpf6" # bold cyan
export tpf7b="$tpfb$tpf7" # bold white
# echo "${tpf0b}black ${tpf1b}red ${tpf2b}green ${tpf3b}yellow ${tpf4b}blue ${tpf5b}magenta ${tpf6b}cyan ${tpf7b}white${tpfn}"

The export allows me to use those tpf.. in Bash scripts.

joharr
  • 282
  • 3
  • 9
2

You may "combined" colours and text-mode.

#!/bin/bash

echo red text / black background \(Reverse\)
echo "\033[31;7mHello world\e[0m";
echo -e "\033[31;7mHello world\e[0m";
echo

echo yellow text / red background
echo "\033[32;41mHello world\e[0m";
echo -e "\033[32;41mHello world\e[0m";
echo "\033[0;32;41mHello world\e[0m";
echo -e "\033[0;32;41mHello world\e[0m";
echo

echo yellow BOLD text / red background
echo "\033[1;32;41mHello world\e[0m";
echo -e "\033[1;32;41mHello world\e[0m";
echo

echo yellow BOLD text underline / red background
echo "\033[1;4;32;41mHello world\e[0m";
echo -e "\033[1;4;32;41mHello world\e[0m";
echo "\033[1;32;4;41mHello world\e[0m";
echo -e "\033[1;32;4;41mHello world\e[0m";
echo "\033[4;32;41;1mHello world\e[0m";
echo -e "\033[4;32;41;1mHello world\e[0m";
echo

enter image description here

Flash Ang
  • 112
  • 4
1

Here there is a simple script to easily manage the text style in bash shell promt:

https://github.com/ferromauro/bash-palette

Import the code using:

source bash-palette.sh

Use the imported variable in echo command (use the -e option!):

echo -e ${PALETTE_GREEN}Color Green${PALETTE_RESET}

It is possible to combine more elements:

echo -e ${PALETTE_GREEN}${PALETTE_BLINK}${PALETTE_RED_U}Green Blinking Text over Red Background${PALETTE_RESET}

enter image description here

Mauro
  • 79
  • 4
1

Emoji

one thing you can do that is not mentioned in the answer is to use emojis to color your output!

echo : error message
echo : warning message
echo : ok status message
echo : action message
echo : Or anything you like and want to recognize immediately by color
echo : Or with a specific emoji

Bonus

This method is very useful especially when your source editor for the script supports displaying Unicode. Then you can also see the colorful script even before running it:

VSCode demo

Note: It's very rare but you may need to put the code of emoji instead:

echo <0001f972> // this emoji: 
Mojtaba Hosseini
  • 47,708
  • 12
  • 157
  • 176
-2

Here is the simplest and readable solution. With bashj (https://sourceforge.net/projects/bashj/), you would simply choose one of these lines:

#!/usr/bin/bash

W="Hello world!"
echo $W

R=130
G=60
B=190

echo u.colored($R,$G,$B,$W)

echo u.colored(255,127,0,$W)
echo u.red($W)
echo u.bold($W)
echo u.italic($W)

Y=u.yellow($W)
echo $Y
echo u.bold($Y)

256x256x256 colors are available if you have the color support in your terminal application.

Alireza
  • 5,172
  • 10
  • 43
  • 109
Fil
  • 21
  • 4
-5
red='\e[0;31m'
NC='\e[0m' # No Color
echo -e "${red}Hello Stackoverflow${NC}"

This answer correct, except that the call to colors should not be inside the quotes.

echo -e ${red}"Hello Stackoverflow"${NC}

Should do the trick.

Dale Corns
  • 225
  • 1
  • 6
  • 3
    Works fine inside the quotes. the -e switch evaluate what's in quotes too. Running both (inside and outside quotes) using bash -x outputs the same executed command `echo -e '\e[0;31mHello Stackoverflow\e[0m'`. So it's just the same for bash. – naab Jul 08 '14 at 08:39