关于bash:如何在Linux中更改echo的输出颜色

How to change the output color of echo in Linux

我正在尝试使用echo命令在终端中打印文本。

我想用红色打印文本。我该怎么做?


您可以使用这些ANSI转义码:

1
2
3
4
5
6
7
8
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

然后在脚本中这样使用它们:

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

它以红色打印love

在@james lim的评论中,如果您使用echo命令,请确保使用-e标志允许反斜杠转义。

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

(使用echo时不要添加"
"
,除非您想添加额外的空行)


您可以使用令人敬畏的tput命令(在ignacio的答案中建议)为各种事物生成终端控制代码。

用法

后面将讨论特定的tput子命令。

直接的

调用tput作为命令序列的一部分:

1
tput setaf 1; echo"this is red text"

使用;而不是&&,因此如果tput出错,文本仍然显示。

壳变量

另一种选择是使用shell变量:

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

tput产生的字符序列被终端解释为具有特殊意义。他们不会被展示出来。请注意,它们仍然可以保存到文件中,或者作为终端以外的程序的输入进行处理。

命令替换

使用命令替换将tput的输出直接插入echo字符串可能更方便:

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

例子

上面的命令在Ubuntu上生成:

Screenshot of colour terminal text

前景色和背景色命令

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

颜色如下:

1
2
3
4
5
6
7
8
9
10
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

也有非ANSI版本的颜色设置功能(setb而不是setabsetf而不是setaf使用不同的数字,这里没有给出。

文本模式命令

1
2
3
4
5
6
7
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

光标移动命令

1
2
3
4
5
6
7
8
9
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

清除和插入命令

1
2
3
4
5
6
7
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

其他命令

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

在compiz摇摆不定的窗口中,bel命令使终端摇摆一秒钟,以吸引用户的注意力。

脚本

tput接受每行包含一个命令的脚本,这些命令在tput退出之前按顺序执行。

通过回显多行字符串并通过管道传输来避免临时文件:

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

也见

  • man 1 tput
  • 有关命令的完整列表和这些选项的更多详细信息,请参阅man 5 terminfo。(对应的tput命令列在从第81行开始的大表的Cap-name列中。)


您可以使用的一些变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# 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

好的。bash、hex和octal中的转义符分别为:

1
2
3
4
5
6
7
|       | 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 |
|       |       |        |         |                              |

简短的例子:

1
2
3
4
5
| 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例外:

如果要在特殊的bash变量中使用这些代码好的。

  • PS0
  • PS1
  • PS2(=这是提示)
  • PS4

您应该添加额外的转义字符,以便bash能够正确地解释它们。如果不添加额外的转义字符,它会起作用,但在历史记录中使用Ctrl + r进行搜索时会遇到问题。好的。bash的异常规则

您应该在任何开始的ANSI代码之前添加\[,在任何结束的代码之后添加\]。例子:正常使用:\033[32mThis is in green\033[0m。对于PS0/1/2/4:\[\033[32m\]This is in green\[\033[m\]。好的。

\[用于开始一系列不可打印字符\]用于非打印字符序列的结尾。好的。

提示:要记住它,您可以先添加\[\],然后将您的ANSI代码放在它们之间:- \[start-ANSI-code\]- \[end-ANSI-code\]好的。颜色序列类型:

  • 3/4位
  • 8位
  • 24位
  • 在潜入这些颜色之前,您应该知道使用这些代码的4种模式:好的。1。色彩模式

    它修改了颜色而不是文本的样式。例如,使颜色变亮或变暗。好的。

    • 0复位
    • 1;比正常轻
    • 2;比正常颜色深

    这种模式不受广泛支持。它完全支持GNOME终端。好的。2。文本模式

    此模式用于修改文本样式而不是颜色。好的。

    • 3;斜体
    • 4;下划线
    • 5;闪烁(慢)
    • 6;闪烁(快速)
    • 7;反向
    • 8;
    • 9;划出

    几乎得到了支持。例如,kde konsole支持5;,但gnome终端不支持,gnome支持8;,但kde不支持。好的。三。前景模式

    此模式用于为前景着色。好的。4。背景模式

    此模式用于为背景着色。好的。

    好的。

    下表显示了ANSI颜色的3/4位版本的摘要好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    |------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
    | 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[32m |         |       | yellow           | echo -e"\033[33m####\033[m" |                                      |
    |         34 | \033[32m |         |       | blue             | echo -e"\033[34m####\033[m" |                                      |
    |         35 | \033[32m |         |       | purple           | echo -e"\033[35m####\033[m" | real name: magenta = reddish-purple  |
    |         36 | \033[32m |         |       | cyan             | echo -e"\033[36m####\033[m" |                                      |
    |         37 | \033[32m |         |       | 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                                            |                                                                                       |
    |------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|

    好的。

    下表显示了8位版本的ANSI颜色的摘要好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    |------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
    | 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     |
    |------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|

    8位快速测试:for code in {0..255}; do echo -e"\e[38;05;${code}m $code: Test"; done好的。

    好的。

    下表显示了24位版本的ANSI颜色的摘要好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    |------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
    | 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 |
    |------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|

    好的。一些屏幕截图

    .gif中的前景8位摘要好的。

    foreground.gif好的。

    .gif中的背景8位摘要好的。

    background.gif好的。颜色摘要及其值

    enter image description hereenter image description hereenter image description hereenter image description here好的。KDE终端上的blinking

    KDE-blinking好的。

    是一个简单的C代码,它向您展示了更多好的。

    cecho_screenshot好的。

    是我为处理这些颜色而开发的一个更高级的工具:bline好的。彩色模式镜头

    fade-normal-bright好的。文本模式镜头

    only-text-mode好的。合并可以

    combine好的。更多镜头

    好的。高级用户和程序员的提示和技巧:我们能用编程语言使用这些代码吗?

    是的,你可以。我在BASH、C、C++、D Perl、Python中有经验。好的。他们会减慢程序的速度吗?

    我想,NO.好的。我们能在窗户上用这些吗?

    3/4位是的,如果用gcc编译代码Win-7的一些屏幕截图好的。如何计算代码长度?

    \033[=2,其他部分1好的。我们在哪里可以使用这些代码?

    任何有tty翻译的地方xtermgnome-terminalkde-terminalmysql-client-CLI等。例如,如果您想用mysql对输出进行着色,可以使用Perl。好的。

    1
    2
    #!/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;

    将此代码存储在一个文件名中:pcc(=perl-colorize character),然后将文件a放入有效的PATH中,然后在您喜欢的任何地方使用它。好的。

    ls | pccdf | pcc好的。

    mysql中,首先为pager注册,然后尝试:好的。

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

    pcc

    它不处理Unicode。

    这些码的colorizing只读的?

    在他们可以的,很多有趣的事情。试试:

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

    或:

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

    有很多初学者,想清除你的屏幕与system("clear" )可以使用此而不是system(3)呼叫

    他们是可在Unicode?

    是的。\u001b

    这是可取的版本,这些颜色吗?

    这是一个容易使用的,但它是非常准确的3/4-bit,使用24-bit和美丽。如果你没有体验到与操作系统是一个快速的HTML教程:24位00000000均值和0000000000000000:。。。。。。。每8位是特定的颜色。24..1716..98..1操作系统中的算法和在HTML #FF0000255;0;0它:在这里是一个HTML #00FF000;255;0均值这样做的意义是什么?你想要什么颜色,这些将它与三个8位的值。

    参考:维基百科ANSI排气序列tldp.orgtldp.orgmisc.flogisoft.com一些博客/网站,我不记得

    好的。


    使用具有setaf功能的tput,参数为1

    1
    echo"$(tput setaf 1)Hello, world$(tput sgr0)"


    1
    echo -e"\033[31m Hello World"

    [31m控制文本颜色:

    • 30-37设置前景颜色
    • 40-47设置背景色

    这里可以找到更完整的颜色代码列表。

    在字符串末尾,最好将文本颜色重置回\033[0m


    这是颜色开关\033[。看历史。

    色码有:1;32(浅绿色)、0;34(蓝色)、1;34(浅蓝色)等。

    我们用颜色开关\033[0m终止颜色序列,不使用颜色代码。就像在标记语言中打开和关闭选项卡一样。

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

    单色echo功能解决方案:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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!"


    仅为一个echo更改颜色的一个简单方法是定义这样的功能:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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;
    }

    用途:

    1
    coloredEcho"This text is green" green

    或者直接使用德鲁答案中提到的颜色代码:

    1
    coloredEcho"This text is green" 2


    使用tput计算颜色代码。避免使用ansi转义码(例如\E[31;1m表示红色),因为它不太便于携带。例如,OSX上的bash不支持它。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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"

    这个问题一次又一次地被回答了:(-)但为什么不呢。

    首先使用tput比通过echo -E手动注入ASCII码在现代环境中更易于移植。

    下面是一个快速的bash函数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     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"
      }

    现在您可以使用:

    1
     say @b@green[[Success]]

    得到:

    Bold-Green Success

    关于tput可移植性的说明

    1986年9月首次上传tput(1)源代码

    tput(1)在20世纪90年代已经有了x/open curses语义(1997年的标准中提到了下面的语义)。

    所以,它无处不在。


    我刚刚将所有解决方案中的好捕获物合并到一起,结果是:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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}
    "

    }

    你可以称之为:

    1
    cecho"RED""Helloworld"


    感谢@K-5的回答

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    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

    结果

    enter image description here

    希望这张图片能帮你挑选适合你的颜色。


    这些代码适用于我的Ubuntu设备:

    enter image description here

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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"

    这将以不同颜色打印字母A B C D:

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

    for循环:

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

    enter image description here


    可读性

    如果要提高代码的可读性,可以先使用echo字符串,然后使用sed添加颜色:

    1
    echo 'Hello World!' | sed $'s/World/\e[1m&\e[0m/'


    到目前为止,我最喜欢的答案是Coloredecho。

    为了发布另一个选项,您可以查看这个小工具xcol

    Colorize your stdout with xcol

    例如,您可以像grep一样使用它,它会为每个参数的stdin着色不同的颜色。

    1
    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

    注意,它接受SED将接受的任何正则表达式。

    此工具使用以下定义

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #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

    我在脚本中使用这些变量,就像这样

    1
    echo"${red}hello ${yellow}this is ${green}coloured${normal}"


    为了扩展这个答案,对于懒惰的我们:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    function echocolor() { # $1 = string
        COLOR='\033[1;33m'
        NC='\033[0m'
        printf"${COLOR}$1${NC}
    "

    }

    echo"This won't be colored"
    echocolor"This will be colorful"


    没有人注意到ansi代码7反向视频的有用性。

    通过交换前景和背景色,它可以在任何终端方案颜色、黑白背景或其他幻想调色板上保持可读性。

    例如,对于适用于所有地方的红色背景:

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

    这是更改终端内置方案时的外观:

    enter image description here

    这是用于GIF的循环脚本。

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

    参见https://en.wikipedia.org/wiki/ansi_escape_code_sgr_u(select_graphic_rendition)_参数


    您绝对应该在原始的ANSI控制序列上使用tput。

    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).

    来自http://wiki.bash-hacker.org/scripting/terminalcodes

    也就是说,我编写了一个名为bash tint的小助手库,它在tput上添加了另一个层,使其更易于使用(imho):

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

    将得出以下结果:enter image description here


    我写了SWAG来实现这一点。

    你可以做

    1
    pip install swag

    现在,您可以通过以下方式将所有escape命令作为txt文件安装到给定的目标:

    1
    swag install -d <colorsdir>

    或者更容易通过:

    1
    swag install

    将颜色安装到~/.colors上。

    你可以这样使用它们:

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

    或者这样,我觉得更有趣的是:

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

    看看Asciinema!


    这就是我以前看到的所有组合,并决定哪个读起来很酷:

    1
    2
    3
    4
    5
    6
    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)
    "

        done
    done


    这是一个简单的小脚本,我最近把它放在一起,它会上色。任何管道输入,而不是使用"厕所"。

    File: color.bsh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #!/usr/bin/env bash

    ## A.M.Danischewski 2015+(c) Free - for (all (uses and
    ## modifications)) - except you must keep this notice intact.

    declare INPUT_TXT=""
    declare    ADD_LF="
    "

    declare -i DONE=0
    declare -r COLOR_NUMBER="${1:-247}"
    declare -r ASCII_FG="\\033[38;05;"
    declare -r COLOR_OUT="${ASCII_FG}${COLOR_NUMBER}m"

    function show_colors() {
       ## perhaps will add bg 48 to first loop eventually
     for fgbg in 38; do for color in {0..256} ; do
     echo -en"\\033[${fgbg};5;${color}m ${color}\t\\033[0m";
     (($((${color}+1))%10==0)) && echo; done; echo; done
    }

    if [[ ! $# -eq 1 || ${1} =~ ^-. ]]; then
      show_colors
      echo" Usage: ${0##*/} <color fg>"
      echo"  E.g. echo "Hello world!" | figlet | ${0##*/} 54"
    else  
     while IFS= read -r PIPED_INPUT || { DONE=1; ADD_LF=""; }; do
      PIPED_INPUT=$(sed 's#\\#\\\\#g' <<<"${PIPED_INPUT}")
      INPUT_TXT="${INPUT_TXT}${PIPED_INPUT}${ADD_LF}"
      ((${DONE})) && break;
     done
     echo -en"${COLOR_OUT}${INPUT_TXT}\\033[00m"
    fi

    然后用红色(196)命名:$> echo"text you want colored red" | color.bsh 196


    参考:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    echo_red(){
        echo -e"\e[1;31m$1\e[0m"
    }
    echo_green(){
        echo -e"\e[1;32m$1\e[0m"
    }
    echo_yellow(){
        echo -e"\e[1;33m$1\e[0m"
    }
    echo_blue(){
        echo -e"\e[1;34m$1\e[0m"
    }


    这里是最简单易读的解决方案。使用bashj(https://sourceforge.net/projects/bashj/),您只需选择以下行之一:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/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颜色。


    就像外面的一些东西一样,通过grep会将其突出显示为红色(但只有红色)。也可以使用命名管道,使字符串更接近行尾:

    1
     grep '.*' --color=always <(echo"foobar")


    1
    2
    3
    red='\e[0;31m'
    NC='\e[0m' # No Color
    echo -e"${red}Hello Stackoverflow${NC}"

    这个答案是正确的,除了对颜色的调用不应该在引号内。

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

    应该有技巧。